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

  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • failblog

    failblog

    17 HAZİRAN 2008
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010