python – numpy数组乘法与任意维度的数组

我有一个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]])
>>>
最佳答案
您可以使用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

但这只适用于2个案例.从@ajcr借用,有足够的转置,我们可以得到隐式广播,适用于一般情况:

>>> C3 = (A * B.T).T
>>> np.allclose(C0, C3)
True

或者,您可以使用einsum来提供通用性.回想起来,与转置路线相比,这可能是过度杀伤,但是当乘法更加复杂时它很方便.

>>> C2 = np.einsum('i,i...->i...', A, B)
>>> np.allclose(C0, C2)
True

>>> 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

转载注明原文:python – numpy数组乘法与任意维度的数组 - 代码日志