【问题标题】:Filter array returning arguments过滤数组返回参数
【发布时间】:2012-10-14 18:09:08
【问题描述】:

我们又来了:

我想要一个很像 filter 的函数,但它应该返回 arguments 而不是值:

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

提前谢谢你。

【问题讨论】:

    标签: python filter arguments scipy


    【解决方案1】:

    对于这种情况,我只使用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])
    

    【讨论】:

    • 是的,这回答了我的问题!非常感谢。
    【解决方案2】:

    您可以使用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)))
    

    【讨论】:

    • 有趣的答案。尽管我发现上面的那个更快,但这个确实帮助我揭示了 itemgetterenumerate 的存在。 +1
    【解决方案3】:
    >>> 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]
    >>> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2015-09-23
      • 2023-01-25
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多