Рішення Рея добре. Однак, на моїй машині це близько 2.5x швидше використовувати numpy.sum
замість 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
На відміну від цього min
, sum
не потрібно розгалуження, що на сучасному апаратному забезпеченні, як правило, досить дорого. Це, мабуть, причина, чому sum
швидше.
редагування Вищевказаний тест проводили з одним NaN праворуч посеред масиву.
Цікаво відзначити, що min
повільніше у присутності NaN, ніж у їх відсутності. Це також здається повільніше, коли NaN наближаються до початку масиву. З іншого боку, sum
пропускна здатність здається постійною незалежно від того, є NaN та де вони знаходяться:
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