python-快速选择行,其中至少N个列在numpy / scipy中为true

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

请注意,使用lambdas首先要花很多钱,而lambda x:sum(x)只是在这里写sum的一种更加冗长和缓慢的方式.

还要注意,如果数组很大,则使用一种可能会短路的方法可能会比上述方法更有效.

上一篇:python-CSR矩阵中元素的总和


下一篇:python-使用线性插值调整numpy ndarray的大小