首页 > 解决方案 > 如何分别用其他元素和减少操作替换 np.dot 中的乘法和求和

问题描述

假设您有 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,但它对 funcs 和 dtypes 的支持有限。

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

有没有任何有效的方法可以在 numpy 中实现这一点?

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

标签: arraysperformancenumpy

解决方案


推荐阅读