3

在当前项目中,我有一个大型多维形状数组(I,J,K,N)和一个暗 N 方阵。

我需要执行数组的最后一个轴与方阵的矩阵向量乘法。

所以显而易见的解决方案是:

for i in range(I):
    for j in range(J):
        for k in range(K):
            arr[i,j,k] = mat.dot(arr[i,j,k])

但这当然是相当缓慢的。所以我也尝试了 numpy 的 tensordot 但收效甚微。我希望是这样的:

arr = tensordot(mat,arr,axes=((0,1),(3))) 

应该可以解决问题,但出现形状不匹配错误。

有人有更好的解决方案或知道如何正确使用 tensordot?

谢谢!

4

2 回答 2

3

这应该做你的循环,但使用矢量化循环:

from numpy.core.umath_tests import matrix_multiply

arr[..., np.newaxis] = matrix_multiply(mat, arr[..., np.newaxis])

matrix_multiply及其姐妹inner1d是隐藏的、无证的、numpy 的宝石,尽管一整套线性代数 gufunc 应该在 numpy 1.8 中看到。matrix_multiply对其输入的最后两个维度进行矩阵乘法,并在其余维度上进行广播。唯一棘手的部分是设置一个额外的维度,以便在乘法时看到列向量,并将其添加回数组中,这样就不会出现形状不匹配。

于 2013-08-11T14:39:09.850 回答
1

我认为您的 for 循环是错误的,对于这种情况dot似乎就足够了:

# a is your IJKN
# b is your NN
c = dot(a, b)

这里c将是一个IJKN数组。如果要对最后一个维度求和以获取IJK数组:

arr = dot(a,b).sum(axis=3)

但我不确定这是否是你想要的……

于 2013-08-11T09:15:24.323 回答