请问有什么方法可以将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
的另一个数组。目前x
和p
都是密集数组,当我调用函数时,我只是在广播:
out = myFun(x[..., None], p)
但是数组x
十分稀疏,只有7%的元素为非零。另一方面,p没有任何零,仅在零和一之间浮动。
我希望通过稀疏矩阵(可能来自scipy.sparse
)可以提高速度。但是,我不知道如何执行此操作,或者是否更有效。
我正在使用python 3。
非常感谢
答案 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。
numexpr