Buang array NumPy ke file csv

545

Apakah ada cara untuk membuang array NumPy ke file CSV? Saya memiliki array NumPy 2D dan perlu membuangnya dalam format yang dapat dibaca manusia.

Dexter
sumber

Jawaban:

867

numpy.savetxt menyimpan array ke file teks.

import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")
Jim Brissom
sumber
2
Apakah ini lebih disukai daripada perulangan melalui array dengan dimensi? Saya kira juga begitu.
Ehtesh Choudhury
51
Anda juga dapat mengubah format setiap gambar dengan kata kunci fmt. default adalah '% .18e', ini bisa sulit dibaca, Anda dapat menggunakan '% .3e' sehingga hanya 3 desimal yang ditampilkan.
Andrea Zonca
3
Andrea, Ya saya menggunakan% 10.5f. Itu cukup nyaman.
Dexter
12
Metode Anda berfungsi dengan baik untuk data numerik, tetapi metode ini menghasilkan kesalahan untuk numpy.arraystring. Bisakah Anda meresepkan metode untuk menyimpan sebagai csv untuk numpy.arrayobjek yang berisi string?
Ébe Isaac
16
@ ÉbeIsaac Anda dapat menentukan format sebagai string juga:fmt='%s'
Luis
137

Anda bisa menggunakannya pandas. Memang diperlukan beberapa memori tambahan sehingga tidak selalu memungkinkan, tetapi sangat cepat dan mudah digunakan.

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

jika Anda tidak ingin tajuk atau indeks, gunakan to_csv("/path/to/file.csv", header=None, index=None)

maxbellec
sumber
4
Namun ini juga akan menulis indeks kolom di baris pertama.
RM-
5
@ RM- Anda dapat menggunakandf.to_csv("file_path.csv", header=None)
maxbellec
4
Tidak baik. Ini menciptakan df dan menghabiskan memori ekstra tanpa biaya
Tex
20
bekerja seperti pesona, sangat cepat - tradeoff untuk penggunaan memori tambahan. parameter header=None, index=Nonemenghapus baris header dan kolom indeks.
thepunitsingh
3
@DaveC: Anda harus mengatur commentsargumen kata kunci '', yang #akan ditekan.
Milind R
46

tofile adalah fungsi yang mudah untuk melakukan ini:

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

Halaman manual memiliki beberapa catatan berguna:

Ini adalah fungsi praktis untuk penyimpanan cepat data array. Informasi tentang endianness dan presisi hilang, sehingga metode ini bukan pilihan yang baik untuk file yang dimaksudkan untuk mengarsipkan data atau mengangkut data antara mesin dengan endianness yang berbeda. Beberapa masalah ini dapat diatasi dengan mengeluarkan data sebagai file teks, dengan mengorbankan kecepatan dan ukuran file.

Catatan. Fungsi ini tidak menghasilkan file csv multi-line, ia menyimpan semuanya menjadi satu baris.

atomh33ls
sumber
5
Sejauh yang saya tahu, ini tidak menghasilkan file csv, tetapi menempatkan semuanya pada satu baris.
Peter
@ Peter, poin bagus, terima kasih, saya telah memperbarui jawabannya. Bagi saya itu tidak menyimpan ok dalam format csv (walaupun terbatas pada satu baris). Juga, jelas bahwa maksud si penanya adalah untuk "membuangnya dalam format yang bisa dibaca manusia" - jadi saya pikir jawabannya relevan dan berguna.
atomh33ls
6
Sejak versi 1.5.0, np.tofile () mengambil parameter opsional newline = '\ n' untuk memungkinkan output multi-line. docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
Kevin J. Black
2
Sebenarnya, np.savetext () memberikan argumen baris baru, bukan np.tofile ()
eaydin
14

Menulis array rekaman sebagai file CSV dengan header membutuhkan sedikit lebih banyak pekerjaan.

Contoh ini membaca file CSV dengan header di baris pertama, lalu menulis file yang sama.

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', ',')

Perhatikan bahwa contoh ini tidak mempertimbangkan string dengan koma. Untuk mempertimbangkan penawaran data non-numerik, gunakan csvpaket:

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())
Mike T
sumber
Di sinilah panda kembali membantu. Anda dapat melakukan: pd.DataFrame (keluar, kolom = ['col1', 'col2']), dll
EFreak
10

Seperti yang sudah dibahas, cara terbaik untuk membuang array ke file CSV adalah dengan menggunakan .savetxt(...)metode. Namun, ada beberapa hal yang harus kita ketahui untuk melakukannya dengan benar.

Misalnya, jika Anda memiliki array numpy dengan dtype = np.int32as

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

dan ingin menyimpan menggunakan savetxtsebagai

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

Ini akan menyimpan data dalam format eksponensial titik mengambang sebagai

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

Anda harus mengubah pemformatan dengan menggunakan parameter yang disebut fmtsebagai

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

untuk menyimpan data dalam format aslinya

Menyimpan Data dalam format gz Terkompresi

Juga, savetxtdapat digunakan untuk menyimpan data dalam .gzformat terkompresi yang mungkin berguna saat mentransfer data melalui jaringan.

Kami hanya perlu mengubah ekstensi file .gzdan numpy akan mengurus semuanya secara otomatis

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

Semoga ini bisa membantu

Daksh
sumber
1
Itu fmt="%d"yang saya cari. Terima kasih!
bayar
6

Saya percaya Anda juga dapat melakukan ini dengan cukup sederhana sebagai berikut:

  1. Ubah array Numpy menjadi kerangka data Pandas
  2. Simpan sebagai CSV

mis. # 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

mis. # 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
DrDEE
sumber
5

jika Anda ingin menulis di kolom:

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

Di sini 'a' adalah nama array numpy dan 'file' adalah variabel untuk ditulis dalam file.

Jika Anda ingin menulis berturut-turut:

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

Jika Anda ingin menyimpan array numpy Anda (mis. your_array = np.array([[1,2],[3,4]])) Ke satu sel, Anda dapat mengonversinya terlebih dahulu your_array.tolist().

Kemudian simpan dengan cara normal ke satu sel, dengan delimiter=';' dan sel dalam file csv akan terlihat seperti ini[[1, 2], [2, 4]]

Maka Anda dapat mengembalikan array Anda seperti ini: your_array = np.array(ast.literal_eval(cell_string))

Tuan Poin
sumber
baik yang benar-benar akan menghancurkan semua penghematan memori untuk menggunakan array numpy
PirateApp
2

Anda juga dapat melakukannya dengan python murni tanpa menggunakan modul apa pun.

# 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)
Greg
sumber
1
Ini menggunakan banyak memori . Lebih suka perulangan di atas setiap baris dan format & tulis itu.
remram
@remram itu tergantung pada data Anda, tapi ya jika itu besar itu dapat menggunakan banyak memori
Greg
2

Dalam Python kita menggunakan modul csv.writer () untuk menulis data ke file csv. Modul ini mirip dengan modul 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()

Pembatas adalah string yang digunakan untuk memisahkan bidang. Nilai standarnya adalah koma (,).

Tamil Selvan S
sumber
Ini telah disarankan: stackoverflow.com/a/41009026/8881141 Harap hanya tambahkan pendekatan baru, jangan ulangi saran yang diterbitkan sebelumnya.
Tuan T