我们再来一次:
我想要一个与 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文档中查找,但没有运气。
提前谢谢。
答案 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]
>>>