我有一个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]]