2012-10-03 7 views
8

Ich versuche ein großes numpy Array zu speichern und neu zu laden. Mit numpy.save und numpy.load sind die Array-Werte beschädigt/ändern. Die Form und der Datentyp des Arrays, das vor dem Speichern und nach dem Laden gespeichert wird, sind identisch, aber beim Nachladen des Arrays ist der Großteil der Werte auf Null gesetzt. Das Array ist (22915,22915), die Werte sind Float64s, 3,94 GB als .npy-Datei und die Dateneinträge durchschnittlich etwa 0,1 (keine winzigen Floats, die vernünftigerweise in Nullen konvertiert werden könnten). Ich benutze numpy 1.5.1.numpy speichern/laden ein Array korrumpieren

Jede Hilfe auf, warum diese Korruption auftritt, würde sehr geschätzt werden, weil ich ratlos bin. Unten finden Sie einen Code, der die oben genannten Behauptungen belegt.

In [7]: m 
Out[7]: 
     array([[ 0.  , 0.02023, 0.00703, ..., 0.02362, 0.02939, 0.03656], 
      [ 0.02023, 0.  , 0.0135 , ..., 0.04357, 0.04934, 0.05651], 
      [ 0.00703, 0.0135 , 0.  , ..., 0.03037, 0.03614, 0.04331], 
      ..., 
      [ 0.02362, 0.04357, 0.03037, ..., 0.  , 0.01797, 0.02514], 
      [ 0.02939, 0.04934, 0.03614, ..., 0.01797, 0.  , 0.01919], 
      [ 0.03656, 0.05651, 0.04331, ..., 0.02514, 0.01919, 0.  ]]) 
In [8]: m.shape 
Out[8]: (22195, 22195) 

In [12]: save('/Users/will/Desktop/m.npy',m) 

In [14]: lm = load('/Users/will/Desktop/m.npy') 

In [15]: lm 
Out[15]: 
     array([[ 0.  , 0.02023, 0.00703, ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       ..., 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ]]) 
In [17]: type(lm[0][0]) 
Out[17]: numpy.float64 

In [18]: type(m[0][0]) 
Out[18]: numpy.float64 

In [19]: lm.shape 
Out[19]: (22195, 22195) 
+1

Haben Sie versucht oder können Sie eine neue Version von Numpy ausprobieren? – nneonneo

+0

Ich kann nicht - 1.5.1 ist eine Abhängigkeit für die anderen Bibliotheken, die ich verwende. Wenn es in einer aktualisierten Version behoben wird (die es in den von mir durchgeführten Suchen gab), dann kann ich vielleicht versuchen, ein Upgrade durchzuführen, obwohl dies natürlich weitere Probleme verursachen könnte. – wdwvt1

+3

Paar Dinge zu versuchen: 1) Suche nach der Position, wo das Array auf Null geht, 2) versuchen, die letzte Zeile/Spalte des Arrays isoliert auszudrucken (um zu sehen, ob es ein komisches Druckproblem sein könnte), 3) versuchen Verwenden von Speicherabbildung durch Spezifizieren von '' r '' als einen zweiten Parameter zu 'Laden'. – nneonneo

Antwort

1

Dies ist ein bekanntes issue (beachten, dass die gegen numpy 1.4 Links). Wenn Sie wirklich nicht upgraden können, wäre mein Rat, zu versuchen, auf eine andere Weise zu speichern (savez, savetxt). Wenn getbuffer verfügbar ist, können Sie versuchen, die Bytes direkt zu schreiben. Wenn alles andere fehlschlägt (und Sie nicht upgraden können), können Sie Ihre eigene Speicherfunktion ziemlich einfach schreiben.