Numpy矩阵线性组合的Numpy向量化

vohkndzv  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(92)

我有一个形状为(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进行向量化。
有人有过类似的经历吗?

ui7jx7zq

ui7jx7zq1#

对于这些类型的操作,np.einsum是完美的。以下是你想要的吗?

B = np.einsum('ij,jkl->ikl', A, X)
print(B.shape) # (3,4,4)

字符串ij,jkl->ikl表示:

  • A分别具有索引(维度)ij
  • X的索引分别为jkl
  • ->ikl乘以A[i,j]*X[j,k,l]并对j求和
f0ofjuux

f0ofjuux2#

您可以通过使用numpy点积函数np.dot()并对数组进行适当的整形来获得所需的结果。下面是一个示例代码片段,演示了如何执行矩阵乘法和重新塑造数组:

import numpy as np

# Create the input arrays
array_5x4x4 = np.random.random((5, 4, 4))
array_3x5 = np.random.random((3, 5))

# Perform the matrix multiplication
result = np.dot(array_3x5, array_5x4x4.reshape(5, -1))

# Reshape the result array to the desired shape
result = result.reshape(3, 4, 4)

# Print the result
print(result)

在这个例子中,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)。

相关问题