过滤数组返回参数

时间:2012-10-14 18:09:08

标签: python filter arguments scipy

我们再来一次:

我想要一个与 filter 类似的函数,但它应该返回参数而不是值:

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文档中查找,但没有运气。

提前谢谢。

3 个答案:

答案 0 :(得分: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]),)

请注意,您要查找的内容实际上是返回元组的第一个元素:

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

您可以使用这些索引再次索引data

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

答案 1 :(得分: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)))

答案 2 :(得分: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]
>>>