Jeg lurer på hvordan jeg lagrer og laster numpy.array
-data på riktig måte. For øyeblikket bruker jeg metoden numpy.savetxt()
. For eksempel, hvis jeg har en array markers
, som ser slik ut:
prøver jeg å lagre den ved hjelp av:
numpy.savetxt('markers.txt', markers)
I et annet skript prøver jeg å åpne en tidligere lagret fil:
markers = np.fromfile("markers.txt")
Og det er det jeg får...
Lagrede data ser først slik ut:
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
Men når jeg lagrer bare innlastede data ved bruk av samme metode, dvs. numpy.savetxt()
, ser det slik ut:
1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76
Hva gjør jeg feil? PS det er ingen andre "backstage"-operasjoner jeg utfører. Bare lagring og lasting, og det er det jeg får. Takk på forhånd.
Den mest pålitelige måten jeg har funnet å gjøre dette på, er å bruke np.savetxt
sammen med np.loadtxt
og ikke np.fromfile
, som er bedre egnet for binære filer skrevet med tofile
. Metodene np.fromfile
og np.tofile
skriver og leser binære filer, mens np.savetxt
skriver en tekstfil.
For eksempel
In [1]: a = np.array([1, 2, 3, 4])
In [2]: np.savetxt('test1.txt', a, fmt='%d')
In [3]: b = np.loadtxt('test1.txt', dtype=int)
In [4]: a == b
Out[4]: array([ True, True, True, True], dtype=bool)
Eller:
In [5]: a.tofile('test2.dat')
In [6]: c = np.fromfile('test2.dat', dtype=int)
In [7]: c == a
Out[7]: array([ True, True, True, True], dtype=bool)
Jeg bruker den førstnevnte metoden selv om den er tregere og skaper større filer (noen ganger): det binære formatet kan være plattformavhengig (for eksempel avhenger filformatet av systemets endianness).
Det finnes et plattformuavhengig format for NumPy-matriser, som kan lagres og leses med np.save
og np.load
:
In [8]: np.save('test3.npy', a) # .npy extension is added if not given
In [9]: d = np.load('test3.npy')
In [10]: a == d
Out[10]: array([ True, True, True, True], dtype=bool)
np.fromfile()
har et sep=
nøkkelordargument:
Skilletegn mellom elementene hvis filen er en tekstfil. Tom ("") separator betyr at filen skal behandles som binær. Mellomrom (" ") i skilletegnet samsvarer med null eller flere mellomromstegn. Et skilletegn som bare består av mellomrom, må matche minst ett mellomrom.
Standardverdien sep="""
betyr at np.fromfile()
prøver å lese den som en binær fil i stedet for en mellomromsseparert tekstfil, slik at du får nonsensverdier tilbake. Hvis du bruker np.fromfile('markers.txt', sep=" ")
får du resultatet du er ute etter.
Men som andre har påpekt, er np.loadtxt()
den foretrukne måten å konvertere tekstfiler til numpy-matriser på, og med mindre filen må være lesbar for mennesker, er det vanligvis bedre å bruke binære formater i stedet (f.eks. np.load()
/np.save()
).