【问题标题】:Multiplying nth column in 2D array by nth array in 3D array using numpy使用 numpy 将 2D 数组中的第 n 列乘以 3D 数组中的第 n 列
【发布时间】:2018-08-12 08:45:24
【问题描述】:

我有一个 2D 和一个 3D numpy 数组,并希望将 2D 数组的每一列乘以其各自的数组。例如乘法

[[[1. 1.]
  [1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]
  [1. 1.]]]

[[ 5  6]
 [ 4  7]
 [ 8 10]]

给予

[[[ 5.  5.]
  [ 4.  4.]
  [ 8.  8.]]

 [[ 6.  6.]
  [ 7.  7.]
  [10. 10.]]]

我目前的代码是:

three_d_array = np.ones([2,3,2])
two_d_array = np.array([(5,6), (4,7), (8,10)])

list_of_arrays = []

for i in range(np.shape(two_d_array)[1]):
    mult = np.einsum('ij, i -> ij', three_d_array[i], two_d_array[:,i])
    list_of_arrays.append(mult)

stacked_array = np.stack(list_of_arrays, 0)

使用来自Multiplying across in a numpy array 的答案 但是有没有办法在没有 for 循环的情况下做到这一点?非常感谢,丹

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    2D 数组中的 nth 列将是第二个轴,3D 数组中的 nth 数组,似乎您的意思是沿第一个轴的 2D 切片。因此,想法是沿three_d_array 对齐第一个轴,沿two_d_array 对齐第二个轴。在剩余的轴中,two_d_array 的第一个轴似乎与three_d_array 的第二个轴对齐。

    所以,为了解决这个问题,我们可以使用两种方法和函数。

    方法#1

    转置 2D 数组,然后将维度扩展到 3D 以在末尾有一个单例,然后与其他 3D 数组执行元素乘法,利用 broadcasting 获得矢量化解决方案 -

    three_d_array*two_d_array.T[...,None]
    

    方法#2

    np.einsum -

    np.einsum('ijk,ji->ijk',three_d_array, two_d_array)
    

    【讨论】:

    • 谢谢!我显然还没有完全理解 einsum,但效果很好!
    猜你喜欢
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2020-04-04
    • 2020-03-28
    • 1970-01-01
    • 2021-02-19
    相关资源
    最近更新 更多