切片以沿着ndarray沿轴提取最大值



我正在尝试为3D NDARRAY沿特定轴(0(找到最大值的索引,然后使用这些索引切成这些值(以及相应的值从第二个平行数组(。例如,

> 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()给出了哪个0轴索引是最大的,即。

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

但这对切片不起作用...

在沿其余轴/昏暗的范围数组时使用advanced-indexing,例如So -

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]])

最新更新