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

标签 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。例如,我希望用户也能够输入形状为 (10,4) 的 B。

那么:我如何使用 numpy 实现这个乘法?谢谢。

附录:例如已被要求。会变小。假设 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数组与任意维度数组的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189190/

相关文章:

python - 在 python 中格式化新文件时出现问题

arrays - 从索引数组创建二进制矩阵

android - 返回 Android 设备的所有可用 IP 地址?

python - h5py:切片数据集而不加载到内存中

python - Numpy 三列之间的最大参数项数,输出为数组

python - 如何从 tensorflow 数据集中提取没有标签的数据

python - 没有名为 'torch.utils.data.distributed' 的模块

python - 使用 Python、Selenium 和 XPath 抓取动态行表

c - 分配字符数组和字符串

python - 相当于 numpy 数组的 pandas read_sql_query?