我有点被纽比的广播规则搞糊涂了。假设您要执行高维数组的轴方向标量积,以将数组维数减少1(基本上是沿着一个轴执行加权求和):
from numpy import *
A = ones((3,3,2))
v = array([1,2])
B = zeros((3,3))
# V01: this works
B[0,0] = v.dot(A[0,0])
# V02: this works
B[:,:] = v[0]*A[:,:,0] + v[1]*A[:,:,1]
# V03: this doesn't
B[:,:] = v.dot(A[:,:])
为什么V03不能工作?在
干杯
np.dot(a, b)
操作over the last axis of a and the second-to-last of b。因此,对于您的问题中的特定情况,您可以始终使用:如果要保持} 轻松实现:
^{2}$v.dot(a)
顺序,则需要将轴放置到位,这可以通过^{我不太喜欢
np.dot
,除非是为了明显的矩阵或向量乘法,因为在使用可选的out
参数时,它对输出数据类型非常严格。Joe Kington已经提到过了,但是如果你要做这种事情,就要习惯np.einsum
:一旦你掌握了语法的诀窍,它将把你花在重塑事物上的时间减少到最低限度:这并不是说它在本案中的相关性太大,但它的速度也快得惊人:
在这种特殊情况下,也可以使用^{} 。在
这就产生了:
^{2}$axes=(0,2)
表示{v
中的第一个轴和{如果考虑速度,
tensordot
要比对小数组使用apply_along_axes
快得多。在(尽管
tensordot
总是更快,但由于开销恒定,对于大型数组来说,这种差异不太明显。)您可以使用^{} 进行此操作:
我认为
^{2}$V03
不起作用的原因是,它与:也就是说,它试图沿着
A
的最外轴计算点积。在相关问题 更多 >
编程相关推荐