2012-10-14 136 views
0

又來了:濾波器陣列返回參數

我想的功能很像過濾,但它應該回到參數而非值:

data = numpy.array([0.0, 35., 2., 44., numpy.pi, numpy.sqrt(2.)]) 
args_pass_A = some_sort_of_f(lambda x: x<4., data) 
print(args_pass_A) 
[0, 2, 4, 5] 
args_pass_B = some_sort_of_f(lambda x: x>=44., data) 
print(args_pass_B) 
[3] 

我試圖查找在scipy.stats和scipy.stats.mstats,我最近已經指向mquantiles(謝謝你aganders3)。這響鈴嗎?我也嘗試在numpy文檔中查找,但沒有運氣。

預先感謝您。

回答

2

對於這種情況,我只是用where[docs]

>>> import numpy 
>>> data = numpy.array([0.0, 35., 2., 44., numpy.pi, numpy.sqrt(2.)]) 
>>> data 
array([ 0.  , 35.  , 2.  , 44.  , 
     3.14159265, 1.41421356]) 
>>> numpy.where(data < 4) 
(array([0, 2, 4, 5]),) 
>>> numpy.where(data > 44.) 
(array([], dtype=int64),) 
>>> numpy.where(data >= 44.) 
(array([3]),) 

請注意,您正在尋找的是r被真正返回的元組的第一個元素:

>>> numpy.where(data < 4)[0] 
array([0, 2, 4, 5]) 

,你可以使用這些指數再次指標data

>>> data[numpy.where(data < 4)[0]] 
array([ 0.  , 2.  , 3.14159265, 1.41421356]) 
+0

是的,這回答了我的問題!非常感謝。 – astabada

0
>>> def some_sort_of_f(data, condition = lambda x: x<4.): 
     rez=[] 
     for i in range(len(data)): 
      if condition(data[i]): 
       rez.append(i) 
     return rez 

>>> data = [0.0, 35., 2., 44.] 
>>> some_sort_of_f(data) 
[0, 2] 
>>> 
1

可以使用enumerate功能,它接受一個列表(orig_list),並返回對列表,其中第一元件是在orig_list項的索引和第二元件 - 從orig_list該項目。

例子:

orig_list = numpy.array([0.0, 35., 2., 44., numpy.pi, numpy.sqrt(2.)]) 
filter_func = lambda (idx, value): value<4. 
filtered_pairs = filter(filter_func, enumerate(orig_list)) 
result = map(lambda (idx, value): idx, filtered_pairs) 

您還可以STDLIB功能itemgetter(模塊操作員)更換ID提取:

from operator import itemgetter 
orig_list = numpy.array([0.0, 35., 2., 44., numpy.pi, numpy.sqrt(2.)]) 
filter_func = lambda (idx, value): value<4. 
result = map(itemgetter(0), filter(filter_func, enumerate(orig_list))) 
+0

有趣的答案。儘管我發現上面的一個更快,但這真的幫助我揭示了* itemgetter *和* enumerate *的存在。 +1 – astabada