Solusi Ray bagus. Namun, di komputer saya, ini sekitar 2,5x lebih cepat untuk digunakan numpy.sum
sebagai pengganti numpy.min
:
In [13]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 244 us per loop
In [14]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 97.3 us per loop
Berbeda dengan min
, sum
tidak memerlukan percabangan, yang pada perangkat keras modern cenderung cukup mahal. Ini mungkin alasan mengapa sum
lebih cepat.
sunting Tes di atas dilakukan dengan satu NaN tepat di tengah-tengah array.
Menarik untuk dicatat bahwa min
keberadaan NaN lebih lambat dibandingkan saat tidak ada. Tampaknya juga menjadi lebih lambat karena NaN semakin mendekati awal larik. Di sisi lain, sum
throughput tampak konstan terlepas dari apakah ada NaN dan di mana lokasinya:
In [40]: x = np.random.rand(100000)
In [41]: %timeit np.isnan(np.min(x))
10000 loops, best of 3: 153 us per loop
In [42]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.9 us per loop
In [43]: x[50000] = np.nan
In [44]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 239 us per loop
In [45]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.8 us per loop
In [46]: x[0] = np.nan
In [47]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 326 us per loop
In [48]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.9 us per loop