Nehmen wir an, ich habe ein Array von Werten, r
, die irgendwo von 0
bis 1
reichen. Ich möchte alle Werte entfernen, deren Schwellenwert vom Median abweicht. Nehmen wir an, dass dieser Schwellenwert 0.5
und len(r) = 3000
ist. Dann werden alle Werte zu maskieren außerhalb dieses Bereichs, kann ich eine einfache Liste Verständnis tun, die Ich mag:Wie kann ich dieses Python-Listen-Verständnis in NumPy machen?
mask = np.array([ri < np.median(r)-0.5 or ri > np.median(r)+0.5 for ri in r])
Und wenn ich einen Timer an es:
import time
import numpy as np
start = time.time()
r = np.random.random(3000)
m = np.median(r)
maxr,minr = m-0.5, m+0.5
mask = [ri<minr or ri>maxr for ri in r]
end = time.time()
print('Took %.4f seconds'%(end-start))
>>> Took 0.0010 seconds
Gibt es einen schnelleren Weg, dieses Listenverständnis zu machen und die Maske mit NumPy
zu erstellen?
Edit:
ich einige Vorschläge unten versucht haben, einschließlich:
Ein Element-weise oder Betreiber:
(r<minv) | (r>maxv)
A Numpy logische oder:
r[np.logical_or(r<minr, r>maxr)]
Eine absolute Differenz boolean-Array:
abs(m-r) > 0.5
Und hier ist die durchschnittliche Zeit, die jeweils ein bis nach 300 Läufen nahm:
Python list comprehension: 0.6511 ms
Elementwise or: 0.0138 ms
Numpy logical or: 0.0241 ms
Absolute difference: 0.0248 ms
Wie Sie sehen können, das element Oder war immer die schnellste, um fast einen Faktor von zwei (weiß nicht, wie das mit Array-Elementen skalieren würde). Wer wusste.
'[ri <-maxr' ist die minus einen Tippfehler melden Sie sich hier? – ayhan
@ayhan yea Sorry, auch die Min und Max wurden gefloppt – Anonymous
Versuchen Sie '(r> maxr) | (r
ayhan