NumPy配列をcsvファイルにダンプする


545

NumPy配列をCSVファイルにダンプする方法はありますか?2D NumPy配列があり、人間が読める形式でダンプする必要があります。

回答:


866

numpy.savetxt 配列をテキストファイルに保存します。

import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")

2
これは、配列を次元でループするよりも優先されますか?私はそう推測しています。
Ehtesh Choudhury、

51
fmtキーワードを使用して、各図のフォーマットを変更することもできます。デフォルトは '%.18e'です。これは読みにくい場合があります。 '%。3e'を使用できるため、小数点以下3桁しか表示されません。
Andrea Zonca、

3
アンドレア、はい私は%10.5fを使用しました。かなり便利でした。
デクスター、

12
あなたのメソッドは数値データに対してはうまく機能しますがnumpy.array、文字列に対してはエラーをスローします。numpy.array文字列を含むオブジェクトのcsvとして保存するメソッドを規定できますか?
EBEアイザック

16
ÉbeIsaac@あなたにも、文字列として書式を指定することができますfmt='%s'
ルイス・

136

使用できますpandas。余分なメモリが必要になるため、常に可能とは限りませんが、非常に高速で使いやすいです。

import pandas as pd 
pd.DataFrame(np_array).to_csv("path/to/file.csv")

ヘッダーやインデックスが必要ない場合は、 to_csv("/path/to/file.csv", header=None, index=None)


4
ただし、これによって最初の行に列インデックスも書き込まれます。
RM- 2017年

5
@ RM-使用可能df.to_csv("file_path.csv", header=None)
maxbellec 2017年

4
良くない。これはdfを作成し、何もしないで余分なメモリを消費します
Tex

20
チャームのように機能し、非常に高速です-追加のメモリ使用量とのトレードオフ。パラメータはheader=None, index=None、ヘッダー行とインデックス列を削除します。
thepunitsingh

3
@DaveC:commentsキーワード引数をに設定する必要があります。''これ#は抑制されます。
Milind R

45

tofile これを行うのに便利な関数です:

import numpy as np
a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
a.tofile('foo.csv',sep=',',format='%10.5f')

manページにはいくつかの便利なメモがあります:

これは、配列データをすばやく保存するための便利な機能です。エンディアンと精度に関する情報は失われるため、この方法は、エンディアンが異なるマシン間でデータをアーカイブしたり、データを転送したりするためのファイルには適していません。これらの問題の一部は、速度とファイルサイズを犠牲にして、データをテキストファイルとして出力することで克服できます。

注意。この関数は複数行のcsvファイルを生成せず、すべてを1行に保存します。


5
私の知る限り、これはcsvファイルを生成せず、すべてを1行に配置します。
Peter

@ピーター、良い点、ありがとう、私は答えを更新しました。私にとっては、CSV形式でokを保存します(ただし、1行に制限されています)。また、質問者の意図が「人間が読める形式でダンプする」ことであることは明らかです。そのため、答えは関連性があり有用です。
atomh33ls

6
バージョン1.5.0以降、np.tofile()はオプションのパラメーターnewline = '\ n'を取り、複数行の出力を可能にします。docs.scipy.org/doc/numpy-1.13.0/reference/generated/...
ケヴィン・J.ブラック

2
実際、np.savetext()は、np.tofile()ではなく改行引数を提供します
eaydin

14

レコード配列をヘッダー付きのCSVファイルとして書き込むには、もう少し作業が必要です。

この例では、最初の行にヘッダーがあるCSVファイルを読み取り、次に同じファイルに書き込みます。

import numpy as np

# Write an example CSV file with headers on first line
with open('example.csv', 'w') as fp:
    fp.write('''\
col1,col2,col3
1,100.1,string1
2,222.2,second string
''')

# Read it as a Numpy record array
ar = np.recfromcsv('example.csv')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i4'), ('col2', '<f8'), ('col3', 'S13')])

# Write as a CSV file with headers on first line
with open('out.csv', 'w') as fp:
    fp.write(','.join(ar.dtype.names) + '\n')
    np.savetxt(fp, ar, '%s', ',')

この例では、コンマを含む文字列は考慮されないことに注意してください。非数値データの引用符を検討するには、csvパッケージを使用します。

import csv

with open('out2.csv', 'wb') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())

ここでもパンダが役立ちます。次のことができます:pd.DataFrame(out、columns = ['col1'、 'col2'])など
EFreak

9

すでに説明したように、配列をCSVファイルにダンプする最良の方法は、 .savetxt(...)メソッドすることです。ただし、適切に実行するために知っておくべきことがいくつかあります。

たとえば、dtype = np.int32asを使用した配列が

   narr = np.array([[1,2],
                 [3,4],
                 [5,6]], dtype=np.int32)

savetxtとして保存したい

np.savetxt('values.csv', narr, delimiter=",")

浮動小数点指数形式でデータを保存します。

1.000000000000000000e+00,2.000000000000000000e+00
3.000000000000000000e+00,4.000000000000000000e+00
5.000000000000000000e+00,6.000000000000000000e+00

次のように呼ばfmtれるパラメータを使用してフォーマットを変更する必要があります

np.savetxt('values.csv', narr, fmt="%d", delimiter=",")

データを元の形式で保存する

圧縮gz形式でのデータの保存

また、ネットワーク経由でデータを転送する際に役立つ圧縮形式でsavetxtデータを格納するために使用することもでき.gzます。

ファイルの拡張子を変更するだけで.gz、numpyがすべてを自動的に処理します

np.savetxt('values.gz', narr, fmt="%d", delimiter=",")

それが役に立てば幸い


1
それfmt="%d"が私が探していたものでした。ありがとうございました!
18

5

次のようにして、これを非常に簡単に行うこともできると思います。

  1. Numpy配列をPandasデータフレームに変換する
  2. CSVとして保存

例#1:

    # Libraries to import
    import pandas as pd
    import nump as np

    #N x N numpy array (dimensions dont matter)
    corr_mat    #your numpy array
    my_df = pd.DataFrame(corr_mat)  #converting it to a pandas dataframe

例#2:

    #save as csv 
    my_df.to_csv('foo.csv', index=False)   # "foo" is the name you want to give
                                           # to csv file. Make sure to add ".csv"
                                           # after whatever name like in the code

4

列に書き込みたい場合:

    for x in np.nditer(a.T, order='C'): 
            file.write(str(x))
            file.write("\n")

ここで、 'a'はnumpy配列の名前、 'file'はファイルに書き込む変数です。

行に書き込みたい場合:

    writer= csv.writer(file, delimiter=',')
    for x in np.nditer(a.T, order='C'): 
            row.append(str(x))
    writer.writerow(row)

2

numpy配列(例えばyour_array = np.array([[1,2],[3,4]]))を1つのセルに保存したい場合は、最初にそれを変換することができますyour_array.tolist()

次に、通常の方法で1つのセルに保存しdelimiter=';' ます。csvファイルのセルは次のようになります。[[1, 2], [2, 4]]

次に、次のようにアレイを復元できます。 your_array = np.array(ast.literal_eval(cell_string))


まあそれは文字通り
ナンピー

2

モジュールを使用せずに、純粋なpythonでそれを行うこともできます。

# format as a block of csv text to do whatever you want
csv_rows = ["{},{}".format(i, j) for i, j in array]
csv_text = "\n".join(csv_rows)

# write it to a file
with open('file.csv', 'w') as f:
    f.write(csv_text)

1
これは大量のメモリを使用します。各行をループして、フォーマットして書き込むことをお勧めします。
レムラム2017年

@remramそれはあなたのデータに依存しますが、もしそれが大きい場合、それは多くのメモリを使用する可能性があります
Greg

2

Pythonでは、csv.writer()モジュールを使用してcsvファイルにデータを書き込みます。このモジュールは、csv.reader()モジュールに似ています。

import csv

person = [['SN', 'Person', 'DOB'],
['1', 'John', '18/1/1997'],
['2', 'Marie','19/2/1998'],
['3', 'Simon','20/3/1999'],
['4', 'Erik', '21/4/2000'],
['5', 'Ana', '22/5/2001']]

csv.register_dialect('myDialect',
delimiter = '|',
quoting=csv.QUOTE_NONE,
skipinitialspace=True)

with open('dob.csv', 'w') as f:
    writer = csv.writer(f, dialect='myDialect')
    for row in person:
       writer.writerow(row)

f.close()

区切り文字は、フィールドを区切るために使用される文字列です。デフォルト値はコンマ(、)です。


これはすでに提案されています:stackoverflow.com/a/41009026/8881141新しいアプローチのみを追加してください。以前に公開された提案を繰り返さないでください。
T氏
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.