【问题标题】:Multiplying a 3D numpy array by a 2D numpy array将 3D numpy 数组乘以 2D numpy 数组
【发布时间】:2020-03-10 13:55:16
【问题描述】:

我需要将 3D numpy 数组乘以 2D numpy 数组。

假设 3D 数组 A 的形状为 (3, 100, 500),而 2D 数组 B 的形状为 (3, 100)。我需要将 3D 数组中的 500 个轴中的每一个轴乘以 2D 数组,然后我需要沿结果数组的第一个轴求和,得到一个大小为 (100, 500) 的数组。

我可以通过几个 for 循环到达那里,但肯定必须有一个 numpy 函数可以在 1 行中实现这一点?我看过np.tensordotnp.dotnp.matmulnp.prodnp.sum,但这些函数都不能做到这一点。

【问题讨论】:

  • 请举个例子。为了清楚起见,您是在第一步询问元素乘法吗?

标签: python numpy vectorization array-broadcasting


【解决方案1】:

我们可以利用 numpy 广播:

import numpy as np

a = np.random.rand(3,100,500)
b = np.random.rand(3,100)

# add new axis to b to use numpy broadcasting
b = b[:,:,np.newaxis]
#b.shape = (3,100,1)

# elementwise multiplication
m = a*b
# m.shape = (3,100,500)

# sum over 1st axis
s = np.sum(m, axis=0)

#s.shape = (100,500)

【讨论】:

    【解决方案2】:

    您可以通过向二维数组添加新的单位轴来广播:

    np.sum(A * B[..., None], axis=0)
    

    None 在索引中在该位置引入了一个单位维度,可用于对齐轴以进行广播。 ...: 的简写,与维度一样多:在这种情况下,它等同于 :, :,因为 B 是二维的。

    另一种写法是

    (A * B.reshape(*B.shape, 1)).sum(axis=0)
    

    【讨论】:

      【解决方案3】:

      您可以尝试以下应该可行的方法,

      np.sum(A.T*B.T,axis=-1).T
      

      这会给你形状 (100,500)

      【讨论】:

        【解决方案4】:

        您可以使用np.einsum 轻松表达这些操作,在这种情况下:

        np.einsum("ijk,ij->jk", A, B)
        

        【讨论】:

          猜你喜欢
          • 2015-11-14
          • 1970-01-01
          • 2020-04-04
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 2013-01-08
          • 1970-01-01
          • 2021-12-29
          相关资源
          最近更新 更多