使用numpy将2D数组中的第n列乘以3D数组中的第n个数组

时间:2018-08-12 08:45:25

标签: python arrays numpy

我有一个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循环的方法吗?非常感谢,丹

1 个答案:

答案 0 :(得分:1)

nth数组中的2D列将是第二个轴,而nth数组中的3D数组将似乎是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)