Python 沿阵列轴的矩阵向量乘法
在当前项目中,我有一个大的多维形状数组(I,J,K,N)和一个dim N的方阵 我需要对数组的最后一个轴和平方矩阵进行矩阵向量乘法 因此,显而易见的解决办法是:Python 沿阵列轴的矩阵向量乘法,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,在当前项目中,我有一个大的多维形状数组(I,J,K,N)和一个dim 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,但几乎没有成功。 我预计会出现以下情况:
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吗
谢谢大家! 我认为您的for循环是错误的,对于这种情况,
dot
似乎就足够了:
# a is your IJKN
# b is your NN
c = dot(a, b)
这里的c
将是一个IJKN
数组。如果要在最后一个维度上求和以获得IJK
数组:
arr = dot(a,b).sum(axis=3)
但我不确定这是否是您想要的…这应该和您的循环一样,但是使用矢量化循环:
from numpy.core.umath_tests import matrix_multiply
arr[..., np.newaxis] = matrix_multiply(mat, arr[..., np.newaxis])
matrix\u multiply
及其姐妹inner1d
是numpy的隐藏、未记录的瑰宝,尽管一整套线性代数gufuncs应该能从numpy 1.8中看到光明matrix_multiply
对其输入的最后两个维度执行矩阵乘法,并对其余维度执行广播。唯一棘手的部分是设置一个额外的维度,这样它在相乘时可以看到列向量,并在赋值时将其添加回数组,这样就不会出现形状不匹配。谢谢,这就是我在多个向量上进行矩阵相乘所需的。我使用了xyzRot=matrix\u multiply(rot,xyz[…,np.newaxis])。重塑(xyz.shape)
其中rot
是一个(3,3)
旋转矩阵,xyz
是一个形状向量数组(n,3)
。非常有用!