2D 数组和长 1d 数组的 numpy 乘积,结果应该是 3d 数组



给定两个数组,a和b,带有形状;(3、3( 和 (1000(,(。如何将它们相乘以获得形状为 (3, 3, 1000( 的数组?

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.linspace(1, 1000, 1000)
c = a * b # does not work
c = np.outer(a, b) # does not work
c = np.outer(a, b[None,] # nope

我尝试了很多东西,太多了,无法全部记住。

我也用谷歌搜索过(并在SO上搜索过(,但无济于事。

IIUC,使用numpy.einsum

c = np.einsum("ij,k->ijk", a, b)

输出:

c.shape
# (3, 3, 1000)

您可以通过重塑数组来乘法来实现:

M,N = a.shape
B = b.size
c = a.reshape(M,N,1) * b.reshape(1,1,B)
print(c.shape)
print(c[:,:,0])
print(c[:,:,B-1])

输出:

% python3 script.py
(3, 3, 1000)
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
[[1000. 2000. 3000.]
[4000. 5000. 6000.]
[7000. 8000. 9000.]]

您需要了解广播规则。底线是:

  • 两个数组需要具有相同数量的轴和
  • 沿每个轴的大小必须相同,或者其中一个轴必须为 1。

您只能将形状 (3,3( 乘以形状 (3,3(、(3,1( 或 (1,3( 的另一个形状。还有其他广播规则。阅读它们。

您的形状为 (3,3( 和 (1000,(。正如你所说,你需要最终的形状是三维的。3需要匹配长度为 1 的轴。与1000相同.因此,您可以为每个轴添加轴,以最终得到形状 (3, 3, 1( 和 (1, 1, 1000(:

c = a[:, :, np.newaxis]* b[np.newaxis,np.newaxis]

最新更新