2017-06-07 41 views
1

我试图找到沿着特定轴(0)为3D ndarray的最大值的指数,然后使用这些指数切出这些值(和来自第二个平行阵列的对应值)。例如,切片提取沿轴的最大值,在一个ndarray

> a = np.random.randint(10, 100, 24).reshape(2, 3, 4) 
> print(a) 
array([[[94, 22, 96, 44], 
     [11, 85, 39, 85], 
     [58, 43, 48, 84]], 

     [[84, 58, 51, 30], 
     [74, 89, 90, 11], 
     [90, 54, 94, 20]]]) 

现在,我很感兴趣,这给那些在零轴的最大的值的指数,即

> a[inds] 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85,], 
     [90, 54, 94, 84,]]) 

使用a.argmax()给出了零轴指数是最大,即

> a.argmax(axis=0) 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [1, 1, 1, 0]]) 

但是这不会对切片工作...

回答

1

使用advanced-indexing在沿着轴/ DIMS其余创建范围阵列,像这样 -

m,n = a.shape[1:] 
Y,Z = np.ogrid[:m,:n] 
Y_max_axis0 = a[inds,Y,Z] 

采样运行 -

In [15]: a 
Out[15]: 
array([[[94, 22, 96, 44], 
     [11, 85, 39, 85], 
     [58, 43, 48, 84]], 

     [[84, 58, 51, 30], 
     [74, 89, 90, 11], 
     [90, 54, 94, 20]]]) 

In [16]: inds = a.argmax(axis=0) 

In [17]: m,n = a.shape[1:] 
    ...: Y,Z = np.ogrid[:m,:n] 
    ...: Y_max_axis0 = a[inds,Y,Z] 
    ...: 

In [18]: Y_max_axis0 
Out[18]: 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85], 
     [90, 54, 94, 84]]) 

更明确的方式来创建这些范围的阵列,然后索引 -

In [19]: a[inds,np.arange(a.shape[1])[:,None], np.arange(a.shape[2])] 
Out[19]: 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85], 
     [90, 54, 94, 84]]) 
+0

非常感谢!我需要在我的高级索引中刷新(很多)......但是有一个简单的理由说明为什么第三个轴('np.arange(a.shape [2])')的索引不需要广播到一个额外的维度(即'np.arange(a.shape [2])[:,None]')? – DilithiumMatrix

+0

@DithithiumMatrix Nah,我们不需要。这就是为什么在'explicit-way'中显示'np.arange(a.shape [2])'的原因。但是使用一个额外的暗淡,如:np.ogrid(前面显示),我们有np.arange(a.shape [2])[None]也不会伤害。 – Divakar

+1

@DilithiumMatrix'inds'会有'(m,n)'的变暗。我们需要扩展'np.arange(m)',因为它沿着'inds'的第一个轴,而'np.arange(n)'沿着'inds'的第二个轴。所以,我们需要扩展第一个范围数组而不是第二个,因为第二个索引时会自动沿'inds'的第一个轴延伸。 – Divakar