给定两个数组,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]