Hızlı onay NaN için NumPy içinde
NumPy bir dizi X
NaN geçtiği (np.nan
) kontrol etmek için en hızlı yol arıyorum. np.isnan(X)
şekil boolean bir dizi oluşturur bu yana söz konusu değil, potansiyel olarak devasa olan X.shape
,.
np.nan != np.nan
çünkü çalışmak için değil gibi görünüyor np.nan in X
, ama denedim. Hızlı ve verimli hafıza bunu yapmak için bir yolu var mı?
(Rica etmek isteyenler"": söyleyemem. nasıl dev Bu kütüphane kodu için giriş onaylama.)
CEVAP
Ray'in çözüm iyidir. Ancak, benim makinede 2.5 x daha hızlı numpy.min
yerine numpy.sum
kullanmak için:
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
modern donanımlar oldukça pahalı olma eğilimindedir hangi dallanma gerektirmez aksine. Bu muhtemelen sum
daha hızlı olmasının nedeni budur.
editYukarıdaki test sağ dizinin ortasında tek bir NaN ile yapıldı.
İlginç min
onların yokluğunda daha NaNs huzurunda daha yavaş olduğunu unutmayın. Ayrıca NaNs dizinin başlangıç için yaklaştıkça daha yavaş almak gibi görünüyor. Diğer yandan sum
'nın işlem hacmi sürekli NaNs olup olmadığını ve nerede olduklarını, ne olursa olsun gibi görünüyor
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
Bir dize içinde hızlı bir karakter tüm...
'in daha hızlı ve eğer bir dizi a...
Hızlı metin dosyası içinde topla tamsa...
Android: bir liste Görünümü içinde bir...
Git içinde bir tamamlama için tüm dosy...