8

行と列の「ヘッダー」情報(テーブルなど)を含むCSVファイルに2D配列を保存したいと思います。numpy.savetxtのヘッダー引数を使用して列名を保存できることは知っていますが、データの最初の列(行のタイトルなど)として他の配列(またはリスト)を含める簡単な方法はありますか?

以下は私が現在それを行う方法の例です。それらの行のタイトルを含めるためのより良い方法はありますか、おそらく私が知らないsavetxtのトリックですか?

import csv
import numpy as np

data = np.arange(12).reshape(3,4)
# Add a '' for the first column because the row titles go there...
cols = ['', 'col1', 'col2', 'col3', 'col4']
rows = ['row1', 'row2', 'row3']

with open('test.csv', 'wb') as f:
   writer = csv.writer(f)
   writer.writerow(cols)
   for row_title, data_row in zip(rows, data):
      writer.writerow([row_title] + data_row.tolist())
4

1 に答える 1

7

多分あなたはこのようなことをしたいでしょう:

# Column of row titles
rows = np.array(['row1', 'row2', 'row3'], dtype='|S20')[:, np.newaxis]
with open('test.csv', 'w') as f:
    np.savetxt(f, np.hstack((rows, data)), delimiter=', ', fmt='%s')

これは暗黙的に文字列の配列に変換dataされており、コンピューター内の 100 万個のアイテムごとに約 200 ミリ秒かかります。

dtypeは20 文字の文字列を'|S20'意味します。小さすぎると、数字が切り刻まれます。

>>> np.asarray([123], dtype='|S2')
array(['12'], 
  dtype='|S2')

私の限られたテストからの別のオプションは遅くなりますが、より多くの制御を提供し、チョッピングの問題はありませんnp.char.mod

# Column of row titles
rows = np.array(['row1', 'row2', 'row3'])[:, np.newaxis]
str_data = np.char.mod("%10.6f", data)
with open('test.csv', 'w') as f:
    np.savetxt(f, np.hstack((rows, str_data)), delimiter=', ', fmt='%s')
于 2012-03-29T16:50:19.550 に答える