【发布时间】:2017-12-13 11:47:06
【问题描述】:
我正在与 Numpy 合作解决图像处理问题,我正在尝试避免循环并执行以下操作:
我有一个 Dims NxNxKxK 的矩阵 M(这是一个矩阵 KxK 的矩阵 NxN),并且对于每一行,我希望将行中的所有 N 个矩阵(KxK)相乘(点积)。因此,如果我在整个 M(所有行)上执行此操作,我会得到矩阵 (KxK) 的向量 V (Nx1),其中 V[i] 包含 M[i,0]xM[i,1 ]x...xM[i,N-1]。
我使用循环实现了这个问题的解决方案,但我想不出没有循环的方法。
实现(带循环):
a = np.array([[1,1,1], [1,1,1], [1,1,1]])
mat = np.array([[a,a,a,a], [a*2,a*2,a*2,a*2], [a*3,a*3,a*3,a*3],
[a*4,a*4,a*4,a*4]]) # the original matrix
N, N, k, k = mat.shape
result = np.ones((N, k, k)) # resulting matrix
for i in range(N):
k = functools.reduce(np.dot, mat[i,:])
result[i,:] = k
print(result)
【问题讨论】:
-
在您的示例中,
N为 4。在您的实际应用中,N的大小是否有上限? -
你的行是否总是由相同的矩阵组成,即
[a,a,a,a]、[a*2,a*2,a*2,a*2]等? -
@WarrenWeckesser - 在我们的示例中,您是对的 N=4,但一般来说,否 - 没有限制。
-
我建议保持原样。
-
原则上,您可以执行
np.einsum('ab,bc,cd,de,ef,fg,gh,hi', *factors[:8])之类的操作,但事实证明它比reduce 方法慢得多。
标签: numpy matrix product multiplication