2010-08-02 16 views
31

BenNegatif öğeleri döngü olmadan nasıl sıfırlarsınız?

Ben sıfıra tüm negatif unsurları ayarlamak istediğiniz
a = np.array([2, 3, -1, -4, 3]) 

gibi bir dizi varsa: [2, 3, 0, 0, 3]. Açıkça olmadan numpy ile nasıl yapılır? I b orijinal a

Sonuç

import numpy as np 
from time import time 

a = np.random.uniform(-1, 1, 20000000) 
t = time(); b = np.where(a>0, a, 0); print "1. ", time() - t 
a = np.random.uniform(-1, 1, 20000000) 
t = time(); b = a.clip(min=0); print "2. ", time() - t 
a = np.random.uniform(-1, 1, 20000000) 
t = time(); a[a < 0] = 0; print "3. ", time() - t 
a = np.random.uniform(-1, 1, 20000000) 
t = time(); a[np.where(a<0)] = 0; print "4. ", time() - t 
a = np.random.uniform(-1, 1, 20000000) 
t = time(); b = [max(x, 0) for x in a]; print "5. ", time() - t 
  1. 1,38629984856
  2. aynı uzunlukta bir dizi örneğin

    c = a * b 
    

    , bir hesaplama modifiye a kullanmaya gerek

  3. 0.516846179962 < - hızlı a.clip (dak = 0);
  4. 0,615426063538
  5. 0,944557905197
  6. 51,7364809513
+1

', [a <0] = 0' (min = 0)' a.clip 'önemli ölçüde daha hızlıdır. – user545424

cevap

54
a = a.clip(min=0) 
+0

daha iyi bir çözüm? –

+0

Olabilir. Hangisinin en hızlı olduğunu görmek için onları test etmeniz gerekecek. Numpy'yi pek kullanmıyorum, bu yüzden emin değilim, ama numpy'nin çok iyi optimize edilmiş olması gerekiyordu, bu yüzden cevaplarımdan daha iyi performans gösterebilirdi. –

+1

wiso, bence en hızlı yolu buldunuz. '% timeit a.clip (dk = 0, out = a)' döngü başına 5.65 mikrosaniye aldı. '% sürümüyle gelen timeit np.where (a> 0; a, 0) 'döngü başına 24 mikrosaniye, [a <0] = 0' döngü başına 11.6 mikrosaniye sürmüştür '% sürümüyle gelen timeit aldı. – unutbu

12

Bunu yapacağını:

a[a < 0] = 0 

orijinal a tutmak ve sadece sıfıra olumsuz unsurları ayarlamak isterseniz bir kopya, önce diziyi kopyalayabilirsiniz:

c = a.copy() 
c[c < 0] = 0 
+0

Birden çok boyutta çalışmayacak. – Dmitry

3

Kullanım where

a[numpy.where(a<0)] = 0 
5

bir püf çarpma kullanmaktır. Bu aslında burada diğer her yöntemden daha hızlı görünüyor. Örneğin

a *= (a>0) # in-place zero-ing 

b = a*(a>0) # copies data 

veya

Ben sürümüyle gelen timeit ile testler, bunların bir kısmı yerinde değiştirebilir ve o ölçüde sonuçları etkileyecektir çünkü> < öncesi hesaplanması ve koştu. Tüm durumlarda a, np.random.uniform(-1, 1, 20000000) idi, ancak a'dan önce 0 olarak ayarlanmış negatifler L = a < 0 ve G = a > 0 değiştirildi. L veya G'u kullanamadığından clip göreceli olarak olumsuz etkilenmiştir (ancak aynı makinede bulunanların hesaplanması sadece 17 ms'dir, bu nedenle hız farkının ana nedeni değildir). clip yerine yerinde yöntemlerini cezalandırmak seçerken

%timeit b = np.where(G, a, 0) # 132ms copies 
%timeit b = a.clip(min=0)  # 165ms copies 
%timeit a[L] = 0    # 158ms in-place 
%timeit a[np.where(L)] = 0  # 122ms in-place 
%timeit b = a*G    # 87.4ms copies 
%timeit np.multiply(a,G,a)  # 40.1ms in-place (normal code would use `a*=G`) 

aşağıdaki zamanlamaları gelip:

yöntemleri 20ms ( a>0 hesaplamak için gerekli süre ya tarafından cezalandırılır Sigara yerinde
%timeit b = np.where(a>0, a, 0)    # 152ms 
%timeit b = a.clip(min=0)     # 165ms 
%timeit b = a.copy(); b[a<0] = 0   # 231ms 
%timeit b = a.copy(); b[np.where(a<0)] = 0 # 205ms 
%timeit b = a*(a>0)       # 108ms 
%timeit b = a.copy(); b*=a>0    # 121ms 

a<0) ve yerinde yöntemler 73-83 ms cezalandırılır (bu nedenle b.copy() yapmak için yaklaşık 53-63ms alır).

Genel çarpma yöntemleri clip çok daha hızlıdır. Yerinde değilse, 1.5x daha hızlıdır. Eğer yerinde yapabilirseniz o zaman 2.75x daha hızlıdır. Benim makine üzerinde

+0

önceden hesaplanan miktarlarda kullanmak için –

+0

hile demektir Fakat hepsi (ama bir) precomputed değerleri kullanın. Önceden hesaplanmış olan hesaplamalar da aynı makinede aynı şartlarda 17 ms alarak hızlıdır, bu yüzden hız farkının nedeni değildir. Ve eğer bunları önceden hesaplamamış olsaydım, o zaman yerinde yöntemler daha hızlı gözükürdü çünkü ilk denemeden sonra sıfırdan başka bir şey olmazdı. – coderforlife

+0

bana adil bir karşılaştırma göstereyim –

İlgili konular