如果我有这个 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/