numpy
配列の構造に興味があるか、csv fomatに興味があるか少し混乱します。
ようnp.savetxt
csvファイルライターは容易にテキストを生成することはできません。
0.2, 4.3, 1.2
1.1, 2.2, 3.1
3.5, 4.1, 1.1, 4300
1.2, 3.3, 1.2
1.5, 2.4, 3.1
3.5, 2.1, 1.1, 4400
savetxt
はトリッキーではありません。これは、書き込みのためにファイルを開き、入力配列を繰り返して、一度に1行ずつファイルに書き出します。効果:fmt
はrow
の各要素について%
フィールドを有する
for row in arr:
f.write(fmt % tuple(row))
。単純な場合、それはfmt = delimiter.join(['fmt']*(arr.shape[1]))
を構成します。言い換えれば、列の数はシムルフィールドfmt
を繰り返します。または、それに複数のフィールドを与えることができますfmt
。
通常の行/ファイル書き込みメソッドを使用してカスタム表示を書き込むことができます。最も簡単なのは、通常のprint
のコマンドを使用して構築し、それをファイルにリダイレクトすることです。
しかし、これを実行した後で、そのセッションをnumpy
セッションに読み込む方法の問題があります。 np.genfromtxt
は欠落したデータを処理できますが、依然として区切り文字を含める必要があります。ブロックを読み込ませるのも面倒です(3行は空白行で区切ります)。それは不可能ではありませんが、いくつかの前処理が必要です。
もちろんgenfromtxt
でもそれほど難解ではありません。ファイルを1行ずつ読み込み、各行を数字や文字列のリストに変換し、それらのリストをマスターリストにまとめます。最後にはそのリストが配列に変換されます。
私はあなたのテキストのような配列を作成することができます
In [121]: dt = np.dtype([('lbl',int), ('block', float, (3,3))])
In [122]: A = np.zeros((2,),dtype=dt)
In [123]: A
Out[123]:
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]])],
dtype=[('lbl', '<i4'), ('block', '<f8', (3, 3))])
In [124]: A['lbl']=[4300,4400]
In [125]: A[0]['block']=np.array([[.2,4.3,1.2],[1.1,2.2,3.1],[3.5,4.1,1.1]])
In [126]: A
Out[126]:
array([(4300, [[0.2, 4.3, 1.2], [1.1, 2.2, 3.1], [3.5, 4.1, 1.1]]),
(4400, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])],
dtype=[('lbl', '<i4'), ('block', '<f8', (3, 3))])
In [127]: A['block']
Out[127]:
array([[[ 0.2, 4.3, 1.2],
[ 1.1, 2.2, 3.1],
[ 3.5, 4.1, 1.1]],
[[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ]]])
私は平らに、すべてのブロック値を持つTXTからそれをロードすることができます。
In [130]: txt=b"""4300, 0.2, 4.3, 1.2, 1.1, 2.2, 3.1, 3.5, 4.1, 1.1"""
In [131]: txt
Out[131]: b'4300, 0.2, 4.3, 1.2, 1.1, 2.2, 3.1, 3.5, 4.1, 1.1'
genfromtxt
は、複雑なDTYPEを扱うことができ、フラットラインリストから順に値を割り当てます。
In [133]: data=np.genfromtxt([txt],delimiter=',',dtype=dt)
In [134]: data['lbl']
Out[134]: array(4300)
In [135]: data['block']
Out[135]:
array([[ 0.2, 4.3, 1.2],
[ 1.1, 2.2, 3.1],
[ 3.5, 4.1, 1.1]])
それを書きます。 savetxt
を使用したい場合は、10列またはフィールド配列に再構成する必要があります。
この理由でパンダを使用できない理由はありますか?そうでない場合は、おそらくnumpyの 'reshape'、' ravel'、 'view'、あるいは[構造化配列](http://docs.scipy.org/doc/numpy/user/basics.rec.html)で何かできます。 ) – JGreenwell