由於您有很多零,您只能寫出窗體(索引,數字)中的非零元素。
假設你用少量的非零數字數組:
In [5]: a = np.zeros((10, 10))
In [6]: a
Out[6]:
array([[ 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., 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., 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., 0.]])
In [7]: a[3,1] = 2.0
In [8]: a[7,4] = 17.0
In [9]: a[9,0] = 1.5
首先,隔離有趣的數字,它們的指標:
In [11]: x, y = a.nonzero()
In [12]: zip(x,y)
Out[12]: [(3, 1), (7, 4), (9, 0)]
In [13]: nonzero = zip(x,y)
現在您只需少量的數據元素離開了。最簡單的方法是將它們寫入文本文件:
這也給你一個機會來觀察數據。在您的C++程序中,您可以使用fscanf
來讀取此數據。
但是你可以更用struct寫入二進制數據減少大小:
In [17]: import struct
In [19]: c = struct.Struct('=IId')
In [20]: with open('numbers.bin', 'w+') as outf:
....: for r, k in nonzero:
....: outf.write(c.pack(r, k, a[r,k]))
到Struct
構造函數的參數的裝置;使用本機日期格式'='。第一個和第二個數據元素是無符號整數'I',第三個元素是雙「d」。
在你的C++程序中,這個數據可能是最好的二進制數據讀入打包的struct
。
編輯:答案更新爲二維數組。
只是一個想法 - 你必須寫出來嗎?如果程序正在同時運行(或可以併發運行),則可以使用各種方法將數據從一個流式傳輸到另一個:命名管道,TCP套接字,共享內存等。 – 2013-03-12 20:59:40