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 中是否有比这些更优雅/更快的方式?如果不是,以上两个哪个最好?

4

1 回答 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

请注意,首先使用 lambdas 会让您失去使用 numpy 的许多好处,而且无论如何这里lambda x: sum(x)只是一种更冗长和更慢的编写方式sum

另请注意,如果阵列很大,则使用可能会短路的方法可能比上述方法更有效。

于 2012-08-13T02:28:58.487 回答