2017-08-10 2 views
1

Es wird benötigt, um mehrere Dateien mit der Erweiterung .npy zu laden und Inhalte daraus in ein neues Array zu schreiben.np.load für mehrere Dateien

Warum funktioniert dieser Code nicht? Was soll ich verbessern?

A = np.empty(0) 
for file in files: 
    inf_from_every_file = np.load(file) 
    A = np.append(A, inf_from_every_file) 
+0

Was ist der Inhalt von 'Dateien' und was ist der Fehler, den Sie bekommen? Wenn Sie mehrere Dateien mit Inhalten haben, die Sie zu einem großen Array verketten möchten, finden Sie möglicherweise eine bessere Leistung, indem Sie jedes geladene Array in eine Liste einfügen und dann alle mit ['np.concatenate'] verknüpfen (https: // docs. scipy.org/doc/numpy-1.11.0/reference/generated/numpy.concatenate.html). – jdehesa

+0

Verwendung von 'np.append' in einer Schleife wie dieser ist langsam, und es ist schwer, den richtigen Startwert zu erhalten. 'np.empty (0)' ist nicht gleichbedeutend mit einer Liste '[]'. Halten Sie sich an den Append-Ansatz, und behandeln Sie, wie Sie diese Arrays in einen nach der Schleife einfügen. – hpaulj

Antwort

0

Wie in den Kommentaren darauf hingewiesen wurde, es ist nicht klar, was meinen Sie mit „nicht funktioniert“. Vorausgesetzt, dass files Dateinamen oder Pfade des Formulars enthält ('a_file.npy') und vorausgesetzt, dass diese Dateien tatsächlich im aktuellen Arbeitsverzeichnis oder in den angegebenen Pfaden existieren, sollte Ihr Code "funktionieren".

Allerdings wird Ihr Code so wie er ist flatten die geladenen Arrays und fügen Sie sie zusammen in einem großen 1D-Array. Dies ist wahrscheinlich nicht das, was Sie wollen, also werde ich davon ausgehen, dass dies Ihr Problem ist.

Um dieses Problem mit Ihrem Ansatz zu lösen, müssten Sie sich das axis Schlüsselwort für np.append ansehen.

Das Anhängen an numpy Arrays in einer Schleife ist jedoch im Allgemeinen eine schlechte Idee, da eine vollständige Kopie des Arrays während jeder erstellt wird. Daher sollten Sie entweder Stick mit einer Liste, gefolgt von np.concatenate:

A = [] 
for fname in files: 
    inf_from_every_file = np.load(fname) 
    A.append(inf_from_every_file) 
A = np.concatenate(A) 

... oder sollten Sie zunächst eine leere Array von Anfang an initialisieren und dann Werte, die durch die Indizierung, um es hinzuzufügen:

A = np.empty((len(files),) + np.load(files[0]).shape) 
for index,fname in enumerate(files): 
    A[index,...] = np.load(fname) 

Beachten Sie, dass die Zeile, die A initialisiert, ein wenig kompliziert wird, wenn Sie die Form der Arrays, die geladen werden sollen, nicht kennen. Hier lade ich das erste Array aus der Liste, um die Forminformationen zu erhalten. Wenn Sie bereits wissen, dass die Form z.B. (100,100), können Sie stattdessen verwenden

A = np.empty((len(files), 100, 100)) 
Verwandte Themen