bob*_*nto 5 python arrays numpy multiplication
我有一个numpy数组A,它有形状(10,).
我也有,作为此时的,具有形状(10,3,5)一个numpy的数组B中.我想在这两者之间进行乘法以得到C,使得C [0,:,] = A [0]*B [0,:,],C [1] = A [1]*B [1 ,:,]]等
我不想用循环来解决这个问题,其中一个原因是事物的美学,另一个原因是这个代码需要非常通用.我希望用户能够输入几乎任何形状的任何B,只要前导尺寸为10.例如,我希望用户能够放入形状B(10,4).
那么:如何使用numpy实现这种乘法?谢谢.
ADDENDUM:有人问过例子.会变小.假设A是numpy数组[1,2,3],B是numpy数组[[1,2],[4,5],[7,8]].我希望两者的乘法得到[[1,2],[8,10],[21,24]]....
>>> a
array([1, 2, 3])
>>> b
array([[1, 2],
[4, 5],
[7, 8]])
>>> #result
>>> c
array([[ 1, 2],
[ 8, 10],
[21, 24]])
>>>
Run Code Online (Sandbox Code Playgroud)
您可以使用None(或np.newaxis) 来扩展A以匹配B:
>>> A = np.arange(10)
>>> B = np.random.random((10,3,5))
>>> C0 = np.array([A[i]*B[i,:,:] for i in range(len(A))])
>>> C1 = A[:,None,None] * B
>>> np.allclose(C0, C1)
True
Run Code Online (Sandbox Code Playgroud)
但这仅适用于第 2 种情况。借用@ajcr,通过足够的转置,我们可以让隐式广播适用于一般情况:
>>> C3 = (A * B.T).T
>>> np.allclose(C0, C3)
True
Run Code Online (Sandbox Code Playgroud)
或者,您可以用来einsum提供通用性。回想起来,与转置路径相比,它可能有点过分了,但当乘法更复杂时,它很方便。
>>> C2 = np.einsum('i,i...->i...', A, B)
>>> np.allclose(C0, C2)
True
Run Code Online (Sandbox Code Playgroud)
和
>>> B = np.random.random((10,4))
>>> D0 = np.array([A[i]*B[i,:] for i in range(len(A))])
>>> D2 = np.einsum('i,i...->i...', A, B)
>>> np.allclose(D0, D2)
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
853 次 |
| 最近记录: |