python - 快速选择行,其中至少 N 许多列在 numpy/scipy 中成立

标签 python numpy scipy

如果我有这个 numpy 数组:

>>> a
array([[ 1,  2,  3],
       [ 4,  4,  6],
       [ 4, 10,  9]])

从其中选择条件至少满足 N 个元素的所有行的最快方法是什么?

例如,选择至少有两个数字可以被 2 整除的所有行。

我想到的解决方案是:

@ find rows where 2 or more elements are evenly divisible by two
N = 2  
a[where(array(map(lambda x: sum(x), a % 2 == 0)) >= N)]

使用 apply_along_axis 的替代解决方案是:

a[where(sum(numpy.apply_along_axis(lambda x: x % 2 == 0, 1, a), axis=1) >= 2)]

在 numpy/scipy 中有比这些更优雅/更快的方法吗?如果不是,以上两个哪一个最好?

最佳答案

我可能会做

In [29]: timeit a[(a % 2 == 0).sum(axis=1) >= 2]
10000 loops, best of 3: 29.5 us per loop

之所以有效,是因为 True/False 的整数值为 1/0。为了比较:

In [30]: timeit a[where(array(map(lambda x: sum(x), a % 2 == 0)) >= N)]
10000 loops, best of 3: 72 us per loop

In [31]: timeit a[where(sum(apply_along_axis(lambda x: x % 2 == 0, 1, a), axis=1) >= 2)]
1000 loops, best of 3: 220 us per loop

请注意,使用 lambda 会让你失去很多最初使用 numpy 的好处,lambda x: sum(x) 只是一种更冗长和更慢的编写方式 总和在这里。

另请注意,如果数组很大,使用可以短路的方法可能比上述方法更有效。

关于python - 快速选择行,其中至少 N 许多列在 numpy/scipy 中成立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11927484/

相关文章:

python - Cherrypy 和 JSON Arduino Web 界面

python - 如何在不启动 Jupyter Notebook 服务器的情况下使用 .ipynb 文件?

python - 计算两个 numpy 数组之间相交值的有效方法

python - Numpy高效矩阵自乘(gram矩阵)

python - 函数 scipy.optimize.minimize 的选项

python - 保存大型 Scipy 稀疏矩阵

python - 是否可以对分块数据使用 DictVectorizer?

python - 从列表生成嵌套字典

python - python计算一定范围内的随机整数

numpy - 加速 NumPy 中的代码