2D稀疏矩阵乘以3D数组

时间:2018-12-07 13:59:27

标签: python python-3.x numpy

请问有什么方法可以将2D稀疏矩阵乘以3D numpy数组吗? 例如,我有此功能

def myFun(x, p):
    r = 2
    out = x * np.log(p) + r * np.log(1-p)
    return out

其中x是维数3500, 90的数组,p是维数3500, 90, 70的另一个数组。目前xp都是密集数组,当我调用函数时,我只是在广播:

out = myFun(x[..., None], p)

但是数组x十分稀疏,只有7%的元素为非零。另一方面,p没有任何零,仅在零和一之间浮动。 我希望通过稀疏矩阵(可能来自scipy.sparse)可以提高速度。但是,我不知道如何执行此操作,或者是否更有效。

我正在使用python 3。

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以使用x关键字来利用where的稀疏性。

def sprse(x, p):
    r = 2
    out = x * np.log(p, where=x.astype(bool)) + r * np.log(1-p)
    return out

from timeit import timeit
x = np.random.uniform(-13, 1, (3500, 90, 1)).clip(0, None)
p = np.random.random((3500, 90, 70))
assert np.all(sprse(x, p)==myFun(x, p))
def f():
    return myFun(x, p)
print(timeit(f, number=3))
def f():
    return sprse(x, p)
print(timeit(f, number=3))

样品运行:

5.171174691990018
3.2122434769989923

答案 1 :(得分:1)

您可以尝试以下实现。对于这个简单的功能,这看起来有点夸张,但是我也很难让@objc func switchCalendarScope(){ if self.calendar.scope == FSCalendarScope.month { // self.calendar.setScope(FSCalendarScope.week, animated: true) // this will cause the calendar to be squished again self.calendar.scope = .week movingConstraint.constant = view.safeAreaLayoutGuide.layoutFrame.size.height * -0.20 } else { // self.calendar.setScope(FSCalendarScope.month, animated: true) self.calendar.scope = .month movingConstraint.constant = 0 } } 与Intel SVML一起使用(否则我更喜欢numexpr)。在Quadcore i7上,此解决方案应为每次调用提供0.07s,并且在更多内核上应具有很好的扩展性。另请注意,第一次调用的编译开销约为0.5s。

Installing Intel SVML

numexpr