2017-02-10 1 views
1

ich viele numpy Dateien zu setzen versuchen eine große numpy Datei zu erhalten, habe ich versucht, diesen Link Python append multiple files in given order to one big file zu folgen und das ist, was ich getan habe:Append mehrere numpy Dateien zu einer großen numpy Datei in Python

import matplotlib.pyplot as plt 
import numpy as np 
import os, sys 

#Read in list of files. You might want to look into os.listdir() 

path= "/home/user/Desktop/ALLMyTraces.npy/test" 
#Test folder contains all my numpy file traces 
traces= os.listdir(path) 

# Create new File 
f = open("/home/user/Desktop/ALLMyTraces.npy", "w") 

for j,trace in enumerate(traces): 

    # Find the path of the file 
    filepath = os.path.join(path, trace) 

    # Load file 
    dataArray= np.load(filepath) 
    f.write(dataArray) 

Datei erstellt, und um sicherzustellen, dass ich die guten Inhalt haben, habe ich diesen Code:

import numpy as np 
dataArray= np.load(r'/home/user/Desktop/ALLMyTraces.npy') 
print(dataArray) 

Dieser Fehler als Ergebnis erzeugt wird:

dataArray= np.load(r'/home/user/Desktop/ALLMyTraces.npy') 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 401, in load 
    "Failed to interpret file %s as a pickle" % repr(file)) 
IOError: Failed to interpret file '/home/user/Desktop/ALLMyTraces.npy' as a pickle 

Ich weiß wirklich nicht das Problem. Jede Hilfe wäre willkommen.

Antwort

1

Sie sollten numpy.save oder numpy.savez verwenden, um gebeizte .npy- oder .npz-Binärdateien zu erstellen. Nur diese Datei kann von numpy.load() gelesen werden. Da Sie eine Textdatei mit f.write (dataarray) erstellen, np.load() mit dem oben genannten Fehler versagt

Hier ist ein Beispiel

fpath ="path to big file" 
npyfilespath ='path to nympy files to be merged ' 
os.chdir(npyfilespath) 

with open(fpath, 'wb') as f_handle: 
    for npfile in glob.glob("*.npy"): 

     # Find the path of the file 
     filepath = os.path.join(path, npfile) 
     print filepath 
     # Load file 
     dataArray= np.load(filepath) 
     print dataArray 
     np.save(f_handle,dataArray) 
dataArray= np.load(fpath) 
print dataArray 

gerade herausgefunden, dass es etwas wirklich interessant in numpiger Last. Es wird nicht alle append-Arrays auf einmal laden :). Lesen Sie diese post für weitere Informationen.

Das bedeutet, wenn Sie alle angehängten Arrays lesen möchten, müssen Sie sie mehrfach laden.

f = open(fpath, 'rb') 
dataArray= np.load(f) #loads first array 
print dataArray 
dataArray= np.load(f) #loads Second array 
print dataArray 
dataArray= np.load(f) #loads Third array 
print dataArray 
+0

Es gibt mir diese Antwort: ‘, Modus ‚‘ bei 0x7f3ed40e48a0> – nass9801

+0

Ich sehe nicht, jede Ausgabe – Shijo

+0

Ihnen sehr für Ihre Hilfe danken, aber in dieser die cas Datei speichert nur den Inhalt der letzten Datei. – nass9801

0

np.save schreibt einen Metablock (mit Form und dtype Arten von Informationen) und einem Datenblock. ist die Ergänzung, die dieses Format lesen kann.

dataArray= np.load(filepath) 

dataArray ist nun ein Array im Speicher, genau wie der Original-Array. Es ist kein direktes Bild der filepath Inhalte.

f.write(dataArray) 

Ich bin nicht einmal sicher, was das in Datei schreibt; es ist sicherlich nicht save/load kompatibel. Ihr allgemeiner Python-Datei-Link sendet Sie also in die falsche Richtung.

Es ist gerade nach vorn Wegen mehrere Arrays in einer Datei zu speichern:

  • concatentate die Arrays zu einem größeren Array, und dass speichern. Dies erfordert Dimensionskompatibilität.

  • np.savez speichert mehrere Arrays in einem zip Archiv. Das heißt, jedes Array wird in einer npy-Datei gespeichert, und diese werden alle im Archiv gesammelt. ist in der Lage, ein solches npz Archiv zu laden (aber lesen Sie, was es über Lazy Load sagt).

Es gibt einige Variationen zu diesem Thema. Sie können Ihr eigenes Archiv mit externen Tools erstellen. Sie könnten auch komplexe Objekttyp-Arrays erstellen, die np.save/load verarbeiten können. Es wird auf pickle zurückgesetzt, wenn Elemente nicht auf die übliche Weise gespeichert werden können.In der Tat könnten Sie pickle verwenden, um mehrere Arrays zu speichern.

Es gab auch SO Diskussionen über die wiederholte Verwendung von np.save in der gleichen Datei. Das ist nicht schwer zu tun, aber die load ist kniffliger. https://stackoverflow.com/a/35752728/901925