0

又来了:

我想要一个很像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 文档中查找,但没有运气。

先感谢您。

4

3 回答 3

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])
于 2012-10-14T18:56:25.677 回答
1

您可以使用enumerate函数,它接受一个列表 ( orig_list) 并返回对列表,其中第一个元素是项目 in 的索引,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)

itemgetter您还可以用 stdlib 函数(模块运算符)替换 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)))
于 2012-10-14T18:46:12.087 回答
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]
>>> 
于 2012-10-14T18:18:56.043 回答