3

このnumpy配列がある場合:

>>> a
array([[ 1,  2,  3],
       [ 4,  4,  6],
       [ 4, 10,  9]])

少なくともN多くの要素で条件が成立するすべての行を選択する最速の方法は何ですか?

たとえば、少なくとも 2 つの数値が 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 でこれらよりもエレガントで高速な方法はありますか? そうでない場合、上記の 2 つのうちどちらが最適ですか?

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

ラムダを使用すると、最初に numpy を使用することの多くの利点が犠牲になることに注意してください。とにかく、ここlambda x: sum(x)で書くのはより冗長で遅い方法です。sum

また、配列が大きい場合は、上記よりも短絡できる方法を使用する方がおそらく効率的であることに注意してください。

于 2012-08-13T02:28:58.487 に答える