我有一个形状为(5,4,4)的numpy ndarray,它是一组5个4x4矩阵。我想把ndarray乘以一个形状为(3,5)的矩阵,我想得到一个形状为(3,4,4)的numpy ndarray,其中结果中的每个矩阵4x4是5个4x4矩阵的线性组合,系数来自矩阵(3,5)的行。
我有以下非常基本的代码:
import numpy as np
np.random.seed(10)
X = np.random.rand(5,4,4)
A = np.random.rand(3,5)
print( A*X )
这就产生了一个我所期望的错误“操作数不能和形状(3,5)(5,4,4)一起广播”
我读了一些关于广播的文章,但我似乎找不到一种方法来编写操作,使其可以通过Numpy进行向量化。
有人有过类似的经历吗?
2条答案
按热度按时间ui7jx7zq1#
对于这些类型的操作,
np.einsum
是完美的。以下是你想要的吗?字符串
ij,jkl->ikl
表示:A
分别具有索引(维度)i
和j
X
的索引分别为j
、k
和l
->ikl
乘以A[i,j]*X[j,k,l]
并对j
求和f0ofjuux2#
您可以通过使用numpy点积函数np.dot()并对数组进行适当的整形来获得所需的结果。下面是一个示例代码片段,演示了如何执行矩阵乘法和重新塑造数组:
在这个例子中,array_5x4x4是你的原始ndarray的形状(5,4,4),和array_3x5是矩阵的形状(3,5)包含系数的线性组合。np.dot()函数执行矩阵乘法,我们使用array_5x4x4.reshape(5,-1)将array_5x4x4整形为形状为(5,16)的2D数组,这使得点积与array_3x5兼容。最后,我们将得到的数组整形为所需的形状(3,4,4)。