Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 沿阵列轴的矩阵向量乘法_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python 沿阵列轴的矩阵向量乘法

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,但几乎没有成功。 我预计会出现以下情况:

在当前项目中,我有一个大的多维形状数组(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,但几乎没有成功。 我预计会出现以下情况:

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)
。非常有用!