2014-09-03 9 views
6

ich eine numpy Array haben, und ich kann einfach ein Element, um es mit append, wie diese anfügen:optimal zu numpy Array anhängen

numpy.append(myarray, 1) 

In diesem Fall habe ich angehängt nur die ganze Zahl 1.

Aber ist dies der schnellste Weg, um ein Array anzuhängen? Ich habe ein sehr langes Array, das Zehntausende umfasst.

Oder ist es besser, das Array zu indizieren und es direkt zuzuordnen? So:

myarray[123] = 1 

Antwort

9

zu numpy Arrays Anfügen ist sehr ineffizient. Dies liegt daran, dass der Interpreter in jedem einzelnen Schritt Speicher für das gesamte Array finden und zuweisen muss. Je nach Anwendung gibt es viel bessere Strategien.

Wenn Sie die Länge im Voraus kennen, empfiehlt es sich, das Array mit einer Funktion wie np.ones, np.zeros oder np.empty vorzubelegen.

desired_length = 500 
results = np.empty(desired_length) 
for i in range(desired_length): 
    results[i] = i**2 

Wenn Sie nicht über die Länge wissen, es ist wahrscheinlich effizienter Ihre Ergebnisse in einer regelmäßigen Liste zu halten und wandelt es danach in ein Array.

results = [] 
while condition: 
    a = do_stuff() 
    results.append(a) 
results = np.array(results) 

Hier sind einige Timings auf meinem Computer.

def pre_allocate(): 
    results = np.empty(5000) 
    for i in range(5000): 
     results[i] = i**2 
    return results 

def list_append(): 
    results = [] 
    for i in range(5000): 
     results.append(i**2) 
    return np.array(results) 

def numpy_append(): 
    results = np.array([]) 
    for i in range(5000): 
     np.append(results, i**2) 
    return results 

%timeit pre_allocate() 
# 100 loops, best of 3: 2.42 ms per loop 

%timeit list_append() 
# 100 loops, best of 3: 2.5 ms per loop 

%timeit numpy_append() 
# 10 loops, best of 3: 48.4 ms per loop 

So können Sie sehen, dass sowohl die Vor-Zuweisung und die Verwendung einer Liste als auch die Konvertierung viel schneller sind.

1

Wenn Sie die Größe des Arrays am Ende des Laufs kennen, wird es viel schneller sein, ein Array der entsprechenden Größe vorzubelegen und dann die Werte festzulegen. Wenn Sie die Datei on-the-fly anhängen müssen, ist es wahrscheinlich besser zu versuchen, dieses eine Element nicht gleichzeitig auszuführen, sondern stattdessen so oft wie möglich anzuhängen, um zu vermeiden, dass immer wieder viele Kopien erzeugt werden. Sie können auch eine Profilerstellung des Zeitunterschieds von np.append, np.hstack, np.concatenate vornehmen. usw.