如果我有这个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的一种更加冗长和缓慢的方式.
还要注意,如果数组很大,则使用一种可能会短路的方法可能会比上述方法更有效.