通过存储在两个具有不同维数的1d arr中的索引从3d arr获取值

时间:2019-02-19 13:19:03

标签: python arrays numpy

我在这个维度上有一个3D值数组:

(3,m,n)

我有两个1D数组,其中一个arr:i和另一个arr:j中的每一项都是索引信息:像(i,j) index in 3d array:3,i,j < / p>

例如:

(array([  0,   0,   0, ..., 637, 638, 639]), array([127, 128, 129, ...,   0,   0,   0]))

因此,我需要使用-dimensions:(3,k,l)-获得3D数组,该值基于两个1D索引; 尽可能快

如果有人需要,我可以举个例子

1 个答案:

答案 0 :(得分:2)

In [39]: arr = np.arange(24).reshape(3,4,2)                                     
In [40]: i, j = np.array([0,2]), np.array([1,0,0])                              

我们需要对ij进行数组排列,以便它们相互广播以索引一个(2,3)块,或者以初始尺寸为(3,2,3)块进行索引。 np.ix_是执行此操作的便捷工具,尽管“手动”操作并不困难。

In [41]: idx = np.ix_(np.arange(3),i,j)                                         
In [42]: idx                                                                    
Out[42]: 
(array([[[0]],

        [[1]],

        [[2]]]), 
 array([[[0],
         [2]]]), 
 array([[[1, 0, 0]]]))

In [43]: arr[idx]                                                               
Out[43]: 
array([[[ 1,  0,  0],
        [ 5,  4,  4]],

       [[ 9,  8,  8],
        [13, 12, 12]],

       [[17, 16, 16],
        [21, 20, 20]]])
In [44]: _.shape                                                                
Out[44]: (3, 2, 3)

请注意ix_生成的数组的形状:

In [45]: [i.shape for i in idx]                                                 
Out[45]: [(3, 1, 1), (1, 2, 1), (1, 1, 3)]

以此为指导,我还可以使用以下方法进行索引编制:

arr[:, i[None,:,None], j[None,None,:]]