使用2D数组沿1轴索引3D数组

时间:2020-02-20 14:29:13

标签: python numpy multidimensional-array indexing numpy-ndarray

假设我有一个形状为[ z,y,x ]的numpy数组 a ,而另一个数组的 b 形状:[ y,x ]。

数组 b 包含沿着z的索引,我希望从 a 中提取每个 y x

到目前为止,我有以下巧妙的方法:

 from_a = np.full_like(b, np.nan)

 for i in range(y):
  for j in range(x): 

   des_ind = b[i,j]

   from_a[i,j] = a[des_ind,i,j]

是否有一种很好的整齐的pythonic方法?

1 个答案:

答案 0 :(得分:1)

您可以将数组b直接用作a的索引:

import numpy as np
z, y, x = 3, 4, 5
a = np.random.randint(10, (z, y, x))
# array([[[2, 1, 8, 3, 0],  | [[9, 3, 6, 8, 7],  | [[6, 6, 2, 1, 4],
#         [4, 0, 1, 2, 9],  |  [5, 9, 0, 7, 1],  |  [3, 9, 4, 4, 8],
#         [0, 0, 7, 2, 6],  |  [7, 9, 8, 4, 9],  |  [9, 7, 0, 3, 0],
#         [3, 5, 2, 9, 3]], |  [6, 8, 9, 5, 9]], |  [4, 3, 0, 1, 1]]])

b = np.random.randint(z, size=(y, x))
# array([[1, 1, 1, 0, 2],
#        [1, 2, 1, 1, 2],
#        [2, 0, 0, 0, 2],
#        [0, 0, 1, 0, 0]])

from_a = a[b, 
           np.arange(y)[:, np.newaxis], 
           np.arange(x)[np.newaxis, :]]
# array([[9, 3, 6, 3, 4],
#        [5, 9, 0, 7, 8],
#        [9, 0, 7, 2, 0],
#        [3, 5, 9, 9, 3]])

有关numpy数组,另请参见advanced indexing