2012-03-27 65 views
5

Python3/Numpy中是否有任何內置函數用於過濾數組並返回剩餘元素的索引?類似於numpy.argsort進行排序。我有的過濾器是設置最小和最大閾值 - 所有低於/高於最小/最大值的值都必須過濾掉。在Python3/Numpy中過濾數組並返回索引

我見過Python的函數filter,但我沒有看到使用它提取索引的方法。

編輯:很多有用的信息在答案中,謝謝!

由於@SvenMarnach指出,面膜是不夠的:

mask = (min_value < a) & (a < max_value) 

現在我有這個面膜適用於同一形狀的其他數組作爲a,但不知道什麼是做到這一點的最好辦法。 ..

回答

4

你可以得到元素的索引的一維數組a在大於min_value和萊比max_value

indices = ((min_value < a) & (a < max_value)).nonzero()[0] 

通常你不需要這些指標,雖然,但你可以用面膜

mask = (min_value < a) & (a < max_value) 

這個面具是一個布爾數組具有相同的形狀a更有效地工作。

編輯:如果具有相同的形狀作爲a陣列b,可以用

b[mask] 
+0

太棒了!感謝您的快速回復。的確,面具就足夠了 - 但是我該如何將這個面具應用於與'a'相同形狀的其他陣列呢? – Katya 2012-03-27 14:59:42

+0

@Katya那是什麼意思?如果你有一個帶有特定掩碼的5x5陣列,你能定義一下應用於4x3或6x6陣列的意思嗎? – Hooked 2012-03-27 15:38:46

+0

@Katya:你是什麼意思的「應用這個面具」?提取相應的元素?我爲此回答了一個句子。 – 2012-03-27 15:53:07

4

命令numpy.wherewill return the indices of an array後您提取的b對應於maskTrue條目」的元素我們在他們身上塗了一個面具。例如:

import numpy as np 
A = np.array([1,2,3,6,2]) 
np.where(A>2) 

給出:

(array([2, 3]),) 

一個更復雜的例子:

A = np.arange(27).reshape(3,3,3) 
np.where((A>10) & (A<15)) 

給出:

(array([1, 1, 1, 1]), array([0, 1, 1, 1]), array([2, 0, 1, 2])) 

我會@SvenMarnach同意,通常你不要ne指數

+0

當我看到這個時,我剛剛創建了自己的'where'版本。嘆。 – senderle 2012-03-27 14:50:27

+0

@senderle它可能也比較慢。每當我想我知道'numpy/scipy'的全部力量時,這個網站告訴我我錯了。 – Hooked 2012-03-27 14:53:17

1

我喜歡Sven的回答很多,實際上,numpy.where確實如你所願,正如Hooked提醒我的那樣。但主要是因爲我已經寫出來了,這裏有另一種方法,只是爲了說明一些技巧。my_filter可以返回相同的形狀的一個布爾陣列作爲輸入的任何功能:

def my_filter(a): 
    return (10 < a) & (a < 40) 

a_mask = my_filter(a) 
indices = [ind[a_mask] for ind in numpy.indices(a.shape)] 

例如:

>>> a = numpy.arange(100).reshape((10, 10)) 
>>> def my_filter(a): 
...  return (min_value < a) & (a < max_value) 
... 
>>> a_mask = my_filter(a) 
>>> [ind[a_mask] for ind in numpy.indices(a.shape)] 
[array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
     3, 3, 3, 3, 3, 3]), 
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 
     4, 5, 6, 7, 8, 9])] 
4

不直接關係到你的問題,但filter()是一組三個的一部分函數map()filter()reduce(),它們允許在Python中進行函數式列表處理。

  • map(mapping_function, input_list)取入一個參數和一個列表的功能,該功能適用​​於依次列表的每個元素,並返回一個輸出列表作爲結果。它或多或少等同於列表理解[mapping_function(item) for item in input_list]

  • filter(filter_function, input_list)返回來自input_list的元素列表,其中filter_function返回True。列表理解相當於[item for item in items if filter_function(item)]

  • reduce(combining_function, input_list)重複組合輸入列表中的相鄰元素對,直到剩下一個值。例如,數字列表的總和可以表示爲reduce(operator.add, numbers)

map()filter()功能由列表解析在Python提供(這就是爲什麼mapfilter功能不經常使用。)

reduce()是其中沒有按」的事情之一對任何事物都表明自己是一個直觀的答案。編寫循環幾乎總是更清晰,這就解釋了爲什麼你不經常看到它。