web-dev-qa-db-ja.com

numpy配列をcsvに保存するとTypeError Mismatchが発生する

私は次の形式の数値データを含むnumpy配列を持っています:

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)])

したがって、これは10個のグループの配列であり、各グループは同じ長さの2つのリストで構成され、数値のみを含みます。次の保存コードを実行すると、以下のエラーが発生します。

numpy.savetxt('exampleData.csv', test, delimiter=',')
TypeError: Mismatch between array dtype ('int32') and format specifier ('%.18e %.18e')

これはfmt = 'xyz'引数の何かで修正できると思いますが、ドキュメントは特に明確ではありません。任意の助けいただければ幸いです。

(私の実際のデータでは、iリストとjリストは長い浮動小数点数のリストです(例: '0.0047322940571'など)。)

9
Pingk

exampleは3次元配列です

In [82]: example=np.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for  k in range(0, 3)])  # chg 10 to 3 for display

In [83]: example.shape
Out[83]: (3L, 2L, 5L)

In [84]: example
Out[84]: 
array([[[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]],

       [[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]],

       [[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]]])

すべてを保存しようとすると、エラーが発生します(バージョンが異なるためメッセージが異なります)。

In [87]: np.savetxt('test.csv',example, delimiter=',')
....
TypeError: float argument required, not numpy.ndarray 

しかし、1つの「行」を保存しても問題ありません

In [88]: np.savetxt('test.csv',example[1,...], delimiter=',')

整数形式で保存すると、きれいな出力になります

In [94]: np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%d')

In [95]: with open('test.csv') as f:print f.read()
0,1,2,3,4
0,0,0,0,0

では、3D配列をどのように保存しますか?あなたがそれをどのように使用/読むかを覚えておいてください。複数のファイル? 1つのファイル内に複数のブロック?

https://stackoverflow.com/a/3685339/901925 は6歳ですSO 3D配列を保存する方法の答えです。簡単な答えは、ファイル、および配列のスライスに対して複数のsavetxtを実行します。これにより、データがブロックに保存されます。ただし、これらのブロックのロードは、別のSO質問です(以前に出てきました)。

In [100]: with open('test.csv','w') as f:
     ...:     for row in example:
     ...:         np.savetxt(f,row,delimiter=',',fmt='%d',footer='====')
     ...:         

In [101]: with open('test.csv') as f:print f.read()
0,1,2,3,4
0,0,0,0,0
# ====
0,1,2,3,4
0,0,0,0,0
# ====
0,1,2,3,4
0,0,0,0,0
# ====

あなたのコメントに応じて、これは機能します

example=np.ones((4,2,100))
np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%.18e')

3D配列を保存する別の方法は、2Dに変形することです。おそらくコメント行に保存した情報を使用して、ロード後に3Dに再形成します

np.savetxt('test.csv',example.reshape(-1,example.shape[-1]), delimiter=',',fmt='%.18e')
9
hpaulj
import numpy

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)])
f = open('exampleData.csv', 'ab')
for i in example:
    numpy.savetxt(f, i, fmt='%i')
0
Chris