2012-12-02 60 views
6

給定一個numpy數組的原始二進制表示,明確還原數組所需的全部元數據集是什麼?numpy's tostring/fromstring ---我需要指定什麼來恢復數組

例如,

>>> np.fromstring(np.array([42]).tostring()) 
array([ 2.07507571e-322]) 

這是可以預期的(一個事後看來,至少):在這裏我還沒有告訴fromstring期待整數,如此這般用默認的浮動。

但是,在我看來,只是指定dtype=np.float64或類似可能會或可能不足夠。例如,

>>> a = np.array([42.]) 
>>> a.dtype 
dtype('float64') 
>>> a.dtype.byteorder 
'=' 

其中the docs tell me表示「本機順序」。意思是說,它在大端和小端機器上會有不同的解釋---或者我錯過了一些簡單的東西?

+0

sys.byteorder給機器的字節序。看起來你也必須保存這個值。 – unutbu

+1

以獨立於平臺的方式保存/加載numpy數組,您可以使用[numpy.save/.load functions](http://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html# numpy.load)。 – jfs

+0

@ J.F.Sebastian:對於單個數組,是的。在我的情況下,我有10到10萬個數組,我將其轉儲到sqlite數據庫(以及其他非數組內容)。此外,我只是好奇於什麼需要平臺無關:-)。 –

回答

3

sys.byteorder給出機器的字節順序。


然而,正如@ J.F.Sebastain,@seberg和@jorgeca建議,np.savez是一個更好的路要走。該help docstring shows

import io 
content = io.BytesIO() 
np.savez(content, x=x, y=y) 
content.seek(0) 

,這意味着你可以在字符串content保存到一個SQLite數據庫。

然後,當你從數據庫中選擇這個字符串,它可以重新轉換成numpy的陣列,

data = np.load(content) 
+0

爲什麼使用'tempfile'而不是'StringIO'? – seberg

+0

@ seberg:是的,你說得對 - 感謝您的糾正!一個StringIO(或未來的兼容性,一個BytesIO)在這裏會更好。 – unutbu

相關問題