SORU
18 Temmuz 2011, PAZARTESİ


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
18 Temmuz 2011, PAZARTESİ


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006