在当前项目中,我有一个大的多维数组形状(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吗?
谢谢!
答案 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)
但我不确定,如果这是你想要的......