如何分别用其他元素替换np.dot中的乘法和和并减少运算

时间:2019-05-17 11:42:26

标签: arrays performance numpy

假设您有2个相对较大的数组ab。您可以使用广播来制作dot产品:

a = np.random.normal(size=(1000, 300))
b = a*2

ref = a.dot(b.T)
res = (a[:,None,:]*b[None,:,:]).sum(2)
np.allclose(ref, res)
# True

timeit -n 1 -r 5 a.dot(b.T)
# 17.6 ms    
timeit -n 1 -r 5 (a[:,None,:]*b[None,:,:]).sum(2)
# 1.83 s

性能差异大约为2个数量级,对于更大的阵列甚至更大。 np.dot更快,因为它使用专用库,而且还因为它不将完整的时间数组a[:,None,:]*b[None,:,:]

存储在内存中

np.dot总是先相乘,然后相减。我想知道是否有可能用任何其他元素运算(例如np.maximum==np.power ...)代替乘法运算,并用其他归约运算(如np.max。我知道这会在现实世界中有特殊用途,但是我认为在某些情况下它可能会有用。

我尝试使用numexpr,但是它对func和dtypes的支持有限。

我还尝试过使用dype=object创建带有自定义乘法和求和方法的数组,但是那样您就不再处理连续的内存块了。

有什么有效的方法可以在numpy中完成此操作吗?

理想情况是一些带有合奏的功能:np.custom_dot(a,b, elementwise_func=my_func, redux_func=my_other_func)

0 个答案:

没有答案