使用numpy将二维数组中的第n列乘以三维数组中的第n列

2024-04-27 03:05:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个2D和一个3D numpy数组,我想用2D数组的每一列乘以它各自的数组。Eg倍增

[[[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循环的方法呢?非常感谢,丹


Tags: of代码innumpyfornp数组array
1条回答
网友
1楼 · 发布于 2024-04-27 03:05:36

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)

相关问题 更多 >