沿阵列轴的矩阵向量乘法

时间:2013-08-11 09:06:50

标签: python arrays numpy matrix

在当前项目中,我有一个大的多维数组形状(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吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

from numpy.core.umath_tests import matrix_multiply

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

matrix_multiply和它的姐姐inner1d是隐藏的,没有记录的,几乎没有宝石的宝石,虽然一整套线性代数gufuncs应该看到numpy 1.8的光。 matrix_multiply对其输入的最后两个维度进行矩阵乘法,并在其余维度上进行广播。唯一棘手的部分是设置一个额外的维度,以便在乘法时看到列向量,并在赋值时将其添加回数组,这样就不会出现形状不匹配。

答案 1 :(得分: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)

但我不确定,如果这是你想要的......