【问题标题】:Filter rows of a numpy array?过滤numpy数组的行?
【发布时间】:2014-11-27 01:57:14
【问题描述】:

我希望将一个函数应用于 numpy 数组的每一行。如果此函数计算结果为 true,我将保留该行,否则我将丢弃它。例如,我的函数可能是:

def f(row):
    if sum(row)>10: return True
    else: return False

我想知道是否有类似的东西:

np.apply_over_axes()

将函数应用于 numpy 数组的每一行并返回结果。我希望得到类似的东西:

np.filter_over_axes()

这会将一个函数应用于 numpy 数组的每一行,并且只返回函数返回 true 的行。有这样的吗?还是应该只使用 for 循环?

【问题讨论】:

    标签: python numpy filter


    【解决方案1】:

    理想情况下,您将能够实现函数的矢量化版本并使用它来执行boolean indexing。对于绝大多数问题,这是正确的解决方案。 Numpy 提供了相当多的函数,可以作用于各种轴以及所有基本操作和比较,因此大多数有用的条件应该是可向量化的。

    import numpy as np
    
    x = np.random.randn(20, 3)
    x_new = x[np.sum(x, axis=1) > .5]
    

    如果您绝对确定自己不能执行上述操作,我建议您使用列表推导(或 np.apply_along_axis)来创建一个布尔数组以用于索引。

    def myfunc(row):
        return sum(row) > .5
    
    bool_arr = np.array([myfunc(row) for row in x])
    x_new = x[bool_arr]
    

    这将以相对干净的方式完成工作,但会比矢量化版本慢得多。一个例子:

    x = np.random.randn(5000, 200)
    
    %timeit x[np.sum(x, axis=1) > .5]
    # 100 loops, best of 3: 5.71 ms per loop
    
    %timeit x[np.array([myfunc(row) for row in x])]
    # 1 loops, best of 3: 217 ms per loop
    

    【讨论】:

    • 感谢 Roger,我想使用的函数比求和要复杂一些,所以我最终可能会使用列表理解解决方案。
    猜你喜欢
    • 2019-01-31
    • 2020-02-13
    • 1970-01-01
    • 2021-04-17
    • 2017-09-29
    • 1970-01-01
    • 2018-06-01
    相关资源
    最近更新 更多