NumPy获取条目的每列索引,这些索引等于2D数组中每列的最大值



我有一个2D数组:

A = np.array([[2,3,4],
[2,0,4],
[1,3,7]])

我正在搜索每列的索引,它们在不使用for循环的情况下重新表示该列的最大值

我想要的是:

max_rowIndices_perColumn = np.array([[0,1],[0,2],[2]])

我有了使用的想法

np.where(A== np.amax(A,axis=0)) 

但就像第二步一样,我想处理每一个特定的专栏本身,我对这个想法并不满意。

提前感谢

您需要对索引行为有更深入的了解。

基本上,np.where按C顺序(逐行(返回True单元格的高级索引:

>>> np.where(mask)
(array([0, 0, 1, 2, 2]), array([0, 1, 0, 1, 2]))

但您需要按照Fortran顺序(逐列(执行,如下所示:

>>> np.where(mask, order='F') # not working, it doesn't support order parameter
(array([0, 1, 0, 2, 2]), array([0, 0, 1, 1, 2]))

它不起作用,但你可以通过mask.T

>>> np.where(mask.T) # fix
(array([0, 0, 1, 1, 2]), array([0, 1, 0, 2, 2]))

剩下的部分是将行索引拆分为多个组。总之,你可以这样解决你的问题:

mask = A == np.amax(A, axis=0)
x, y = np.where(mask.T)
div_points = np.flatnonzero(np.diff(x)) + 1
np.split(y, div_points)
>>> [array([0, 1]), array([0, 2]), array([2])]

定义一个函数来获取列中最大值的索引:

def idxMax(col):
_, _, inv = np.unique(-col, return_index=True, return_inverse=True)
return np.where(inv == 0)[0].tolist()

然后生成结果为:

result = np.array([ idxMax(col) for col in A.T ], dtype=object)

对于源数据,结果是:

array([list([0, 1]), list([0, 2]), list([2])], dtype=object)

请注意,在一般情况下,不能保证每列将返回相同数量的最大索引,因此结果数组为a";粗糙的";一个,在这种情况下,Numpy需要传递dtype=object

但是,如果您只需获得一个简单的pythonic列表(而不是Numpy数组(,就可以将上述代码缩减为:

result = [ idxMax(col) for col in A.T ]

在这种情况下,结果是:

[[0, 1], [0, 2], [2]]

最新更新