我正在尝试为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]])