2016-02-15 79 views
3

我有一個矩陣,有許多行和8列。 每個單元格表示當前行屬於8個類中的1個的概率。 我想只保留每行中的2個最高值,並將其餘值設置爲0.numpy矩陣,通過排序每個行將值設置爲0

到目前爲止,我能想到的唯一方法是分別循環和排序每一行。 例如:

a = np.array([[ 0.2 , 0.1 , 0.02 , 0.01 , 0.031, 0.11 ], 
       [ 0.5 , 0.1 , 0.02 , 0.01 , 0.031, 0.11 ], 
       [ 0.2 , 0.1 , 0.22 , 0.15 , 0.031, 0.11 ]]) 

我想獲得:

array([[ 0.2 , 0. , 0. , 0. , 0. , 0.11], 
     [ 0.5 , 0. , 0. , 0. , 0. , 0.11], 
     [ 0.2 , 0. , 0.22, 0. , 0. , 0. ]]) 

感謝,

回答

3

下面是與np.argpartition一個量化的方法 -

m,n = a.shape 
a[np.arange(m)[:,None],np.argpartition(a,n-2,axis=1)[:,:-2]] = 0 

採樣運行 -

In [570]: a 
Out[570]: 
array([[ 0.94791114, 0.48438182, 0.54574317, 0.45481231, 0.94013836], 
     [ 0.03861196, 0.99047316, 0.7897759 , 0.38863967, 0.93659426], 
     [ 0.49436676, 0.93762758, 0.33694977, 0.45701655, 0.73078113], 
     [ 0.21240062, 0.85141765, 0.00815352, 0.52517721, 0.49752736]]) 

In [571]: m,n = a.shape 
    ...: a[np.arange(m)[:,None],np.argpartition(a,n-2,axis=1)[:,:-2]] = 0 
    ...: 

In [572]: a 
Out[572]: 
array([[ 0.94791114, 0.  , 0.  , 0.  , 0.94013836], 
     [ 0.  , 0.99047316, 0.  , 0.  , 0.93659426], 
     [ 0.  , 0.93762758, 0.  , 0.  , 0.73078113], 
     [ 0.  , 0.85141765, 0.  , 0.52517721, 0.  ]]) 
+0

酷!謝謝 ! – matlabit

1

這應該工作,但是,它改變了a。這是你想要的嗎?避免循環至關重要嗎?

sorted = np.sort(a, axis=1) 

for idx, row in enumerate(a): 
    row[row < sorted[idx,-2]] = 0  

或者你可以這樣做:

a[a < sorted[:,None,-2]] = 0 
+1

認爲你需要'一個<排序[:,無,-2]'而不是保持e「2D」形狀。因此,它將僅僅是'a [a <排序[:,無,-2]] = 0',忽略了聯繫情況。 – Divakar

+0

@Divakar我不得不承認,我奇怪的不知道索引與'None',這是*非常有用的知識 - 謝謝! – Lisa

+0

好吧,我沉迷於它!希望你更頻繁地使用它:) – Divakar