ゼロがたくさんあるので、ゼロ以外の要素をフォーム(インデックス、数値)に書き出すことしかできませんでした。
ゼロ以外の数値が少量ある配列があるとします。
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)
これで、残っているデータ要素の数は少なくなります。最も簡単なのは、それらをテキストファイルに書き込むことです。
In [17]: with open('numbers.txt', 'w+') as outf:
....: for r, k in nonzero:
....: outf.write('{:d} {:d} {:g}\n'.format(r, k, a[r,k]))
....:
In [18]: cat numbers.txt
3 1 2
7 4 17
9 0 1.5
これにより、データを目で確認する機会も得られます。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
コンストラクターへの引数は、次のことを意味します。ネイティブの日付形式'='を使用します。1番目と2番目のデータ要素は符号なし整数'I'、3番目の要素はdouble'd'です。
C ++プログラムでは、このデータはおそらくバイナリデータとしてパックに読み込まれるのが最適struct
です。
編集:2D配列の回答が更新されました。