2012-10-23 85 views
15

必須有一種(非常)快速有效的方法來從numpy數組中獲取元素,或者從一部分中獲取更有趣的元素。 假設我有一個numpy的數組:只獲取那些滿足numpy數組條件的值

import numpy as np 
a = np.arange(-10,10) 

現在,如果我有一個列表:

s = [9, 12, 13, 14] 

我可以從選擇元素:

a[s] #array([-1, 2, 3, 4]) 

怎樣纔可以有一個(numpy的)由滿足條件的a [s]中的元素組成的數組,即正數(或負數)? 應該導致

np.ifcondition(a[s]>0, a[s]) #array([2, 3, 4]) 

它看起來微不足道,但我沒能找到一個簡單的和濃縮的表達。我敢肯定,口罩確實不錯,但對我來說並不直接。 然而,無論是:

a[a[s]>0] 
a[s[a[s]>0]] 

其實都是不錯的選擇。

感謝您的幫助。

+0

大多數類似'np.clip'或'np.where'的工具都保留了數組的原始大小,所以它們並不適合我的需要。 – gluuke

回答

12

如何:

In [19]: b = a[s] 

In [20]: b[b > 0] 
Out[20]: array([2, 3, 4]) 
+0

對! ...它似乎工作:我只需要定義一個新的數組。 – gluuke

+2

'a [s] [a]> 0]'也可以,但它會導致numpy重新計算'a [s]'兩次。 – unutbu

+0

這是做這種事情的標準方式。 (從我+1) – mgilson

4

你一定要接受unutbu的答案,這是我通常使用的這種情況numpy的範圍內。但有做事情的方式,例如,具有numpy的外面工作的方法的利益,或在情況下,中間陣列是進攻巨大的,我會添加這種替代:

In [3]: [a[S] for S in s if a[S]>0] 
Out[3]: [2, 3, 4] 

再次,unutbu的方法明顯更快。但我喜歡這種方法,因爲它可以進一步推廣。如果你有一個昂貴時髦的功能(例如,沒有索引),並且想測試功能的結果,你可能會想這樣做:

In [5]: [f for S in s for f in [FunkyFunction(a[S])] if f>0] 
Out[5]: [2, 3, 4] 

關於這個奇怪的是,你讓裏面的列表另一個列表,但是這個內部列表只包含一個項目。基本上你正在做的是將值保存到變量f,然後使用該值兩次:一次測試值(f>0),一次在測試通過時在列表中使用該值。

1

我知道這是一個古老的問題,我不確定在問它時是否有以下可用的問題,但是因爲我在這裏遇到了類似的問題,所以這是我發現的結果對我而言:

np.extract(a[s] > 0, a[s])