假设您有2个相对较大的数组a
和b
。您可以使用广播来制作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)