2016-12-18 4 views
-2

Hier ist eine interessante Beobachtung:ndarry in numpy: teuer in ndarray Iteration

1 import numpy as np 
2 data = np.array([[255,255,255], [0, 0, 255], [255, 0, 0]], np.int8) 
3 for i in range(1000000): 
4 for row in data: 
5  for col in row: 
6   flag = col > 0 

Der obige Code nimmt ~ 17 Sekunden zu beenden. Wenn ich tun

data = data.tolist() 

Dann wird die ganze Sache nur data zur Liste konvertieren nimmt < 1 Sekunde zu beenden.

Möchten Sie wissen: 1. Was ist der Grund für die niedrige Effizienz im Vergleich von NDarray-Werten? 2. Was ist eine geeignetere Methode, um den Vergleich durchzuführen, wenn ich das NDarray nicht in eine Liste umwandle? Wäre es effizienter, als wenn ich es in eine Liste umwandeln würde?

Vielen Dank!

-------------- bearbeitet Frage: -------------

Wie @hpaulj wies darauf hin, es ist die Iteration nicht Wertvergleich, das ist sehr teuer. Aber ich muss durch das Array iterieren. Gibt es einen besseren Weg, als ihn in eine Liste zu konvertieren?

+0

Es ist nicht der Wertvergleich, der teuer ist, es ist die Iteration. Sie sollten den Vergleich auf das gesamte Array anwenden. – hpaulj

+0

Ich habe einen Fehler gefunden: Der Typ np.int8 kann 255 nicht speichern. Es ist ein signierter Typ, der nur -128 ~ 127 speichern kann. Also sind Ihre Daten 'np.array ([[- 1, -1, -1], [0, 0, -1], [-1, 0, 0]], np.int8). – gzc

+0

@hpaulj Ya. Einverstanden. Nur gedacht. Aber ich muss das ganze ndarray iterieren. Irgendein besserer Weg? – cheng

Antwort

0

Von der Seitenleiste: Why is a `for` over a Python list faster than over a Numpy array?

Die Frage, wie Iteration über ein Array zu machen kommt schneller oft auf - und beste Antwort ist „nicht“, oder besser gesagt, drücken Sie die Iteration auf kompilierte numpy Code. Es gibt keine Möglichkeit, die explizite Iteration auf Python-Ebene wesentlich schneller zu machen. Einige Tricks können eine 2x Beschleunigung, aber keine Größenordnung ergeben.

Also in Ihrem Fall ist die Antwort it depends on what you are doing at each iteration. Wie die Antwort zeigt, können Sie den Vergleich Element für Element mit einem numpy Ausdruck durchführen. Sie müssen nicht iterieren, um diese Aktion auszuführen.

1

Ein geeigneterer und effektiverer Weg ist die Verwendung von elementaren Vergleichen.

for i in range(1000000): 
    flag = data > 0 
Verwandte Themen