Ich schrieb etwas Code in Python, der gut funktioniert, aber sehr langsam ist; Ich denke aufgrund der for-Schleifen. Ich hoffe, man kann die folgenden Operationen mit numpy Befehlen beschleunigen. Lass mich das Ziel definieren.numpy Vektorisierung statt für Schleifen
Angenommen, ich habe ein 2D-Numy-Array all_CMs
mit den Abmessungen row
x col
. Betrachten Sie zum Beispiel ein 6
x 11
Array (siehe Zeichnung unten).
Ich möchte, den Mittelwert für alle Zeilen berechnen, das heißt Summe ⱼ aᵢⱼ in einem Array führt. Dies kann natürlich leicht durchgeführt werden. (I nennen diesen Wert
CM_tilde
)Nun, für jede Reihe I den Mittelwert von einigen ausgewählten Werte berechnet werden soll, und zwar alle Werte unterhalb einer bestimmten Schwelle durch ihre Summe Rechen- und es durch die Anzahl aller Spalten Dividieren (
N
). Wenn der Wert über diesem definierten Schwellenwert liegt, wird der WertCM_tilde
(Mittelwert der gesamten Zeile) hinzugefügt. Dieser Wert wirdCM
genanntDanach wird der
CM
Wert wird von jedem Element subtrahiert in der Reihe
Zusätzlich dazu ich eine numpy Array oder eine Liste haben wollen, wenn diese alle CM
Werte aufgeführt sind .
Die Figur:
Der folgende Code funktioniert, aber sehr langsam (vor allem, wenn die Arrays immer groß)
CM_tilde = np.mean(data, axis=1)
N = data.shape[1]
data_cm = np.zeros((data.shape[0], data.shape[1], data.shape[2]))
all_CMs = np.zeros((data.shape[0], data.shape[2]))
for frame in range(data.shape[2]):
for row in range(data.shape[0]):
CM=0
for col in range(data.shape[1]):
if data[row, col, frame] < (CM_tilde[row, frame]+threshold):
CM += data[row, col, frame]
else:
CM += CM_tilde[row, frame]
CM = CM/N
all_CMs[row, frame] = CM
# calculate CM corrected value
for col in range(data.shape[1]):
data_cm[row, col, frame] = data[row, col, frame] - CM
print "frame: ", frame
return data_cm, all_CMs
Irgendwelche Ideen?
In Schritt 2 ersetzt man im wesentlichen einen Wert, der durch CM_tilde über die Schwelle ist, und * * dann den Mittelwert über die gesamte Zeile berechnen, die ersetzten Werte einschließlich? – Evert
Beginnen Sie mit 'np.where', um Ihre innere for-Schleife zu ersetzen. Mithilfe der Übertragung können Sie die äußeren 2 Schleifen entfernen. Siehe die Dokumentation für [wo] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html) – mtadd