2017-04-18 79 views
1

我想要找出每行中最小值的索引,並且我使用下面的代碼。從numpy數組中選擇最小索引的第一個出現

#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

使用'argmin':'C.argmin(1)'和'np.arange(C。形狀[0])'爲行索引。 – Divakar

+0

Divakar謝謝,請在答案中加上它,我會將其標記爲正確的答案。 –

回答

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) 
相關問題