numpy/scipy中快速选择至少有N列为真的行

3
如果我有这个 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方法?如果没有,那么以上两种方法中哪一种最好?
1个回答

3
我可能会这样做。
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)只是编写sum的更冗长和更慢的方法。
另请注意,如果数组很大,则使用可以短路的方法可能更有效率。

我有相同的问题,矩阵很大。有哪种方法可以进行短路运算? - Wai Yip Tung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接