从numpy数组中选择第一次出现的最小索引

时间:2017-04-18 20:34:03

标签: python python-2.7 python-3.x numpy scipy

我试图找出每行中最小值的索引,我正在使用下面的代码。

#code
import numpy as np
C = np.array([[1,2,4],[2,2,5],[4,3,3]])
ind = np.where(C == C.min(axis=1).reshape(len(C),1))
ind

#output
(array([0, 1, 1, 2, 2], dtype=int64), array([0, 0, 1, 1, 2], dtype=int64))

但问题是它返回每行中所有最小值的索引。但我只希望第一次出现最小值。喜欢

(array([0, 1, 2], dtype=int64), array([0, 0, 1], dtype=int64))

1 个答案:

答案 0 :(得分:2)

如果您要使用与最小值的比较,我们需要使用np.min并将keepdims设置为True的维度保留给我们一个布尔数组/掩码。要选择第一次出现,我们可以在掩码的每一行使用argmax,从而得到我们想要的输出。

因此,获取相应列索引的实现将是 -

(C==C.min(1, keepdims=True)).argmax(1)

逐步运行示例 -

In [114]: C   # Input array
Out[114]: 
array([[1, 2, 4],
       [2, 2, 5],
       [4, 3, 3]])

In [115]: C==C.min(1, keepdims=1) # boolean array of min values
Out[115]: 
array([[ True, False, False],
       [ True,  True, False],
       [False,  True,  True]], dtype=bool)

In [116]: (C==C.min(1, keepdims=True)).argmax(1) # argmax to get first occurances
Out[116]: array([0, 0, 1])

行索引的第一个输出只是一个范围数组 -

np.arange(C.shape[0])

要获得首次出现最小值的相同列索引,直接的方法是使用np.argmin -

C.argmin(axis=1)