NumPy dizisini bir csv dosyasına dökün


545

NumPy dizisini CSV dosyasına dökmenin bir yolu var mı? Bir 2D NumPy dizisi var ve insan tarafından okunabilir biçimde dökümü gerekiyor.

Yanıtlar:


866

numpy.savetxt bir diziyi bir metin dosyasına kaydeder.

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

2
bu dizi içinde boyuta göre döngü üzerinden tercih edilir mi? Öyle tahmin ediyorum.
Ehtesh Choudhury

51
fmt anahtar sözcüğüyle her bir şeklin biçimini de değiştirebilirsiniz. varsayılan '% .18e', bu okunması zor olabilir, '% .3e' kullanabilirsiniz, böylece sadece 3 ondalık sayı gösterilir.
Andrea Zonca

3
Andrea, Evet% 10.5f kullandım. Oldukça uygun.
Dexter

12
Yönteminiz sayısal veriler için iyi çalışır, ancak numpy.arraydizeler için bir hata atar . Dize numpy.arrayiçeren bir nesne için csv olarak kaydetmek için bir yöntem önerebilir misiniz ?
Ébe Isaac

16
@ ÉbeIsaac Biçimi dize olarak da belirleyebilirsiniz:fmt='%s'
Luis

136

Kullanabilirsiniz pandas. Ekstra bellek gerektirir, bu yüzden her zaman mümkün değildir, ancak kullanımı çok hızlı ve kolaydır.

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

başlık veya dizin istemiyorsanız şunu kullanın: to_csv("/path/to/file.csv", header=None, index=None)


4
Ancak bu, ilk satıra bir sütun dizini de yazacaktır.
RM-

5
@ RM- kullanabilirsinizdf.to_csv("file_path.csv", header=None)
maxbellec

4
İyi değil. Bu bir df oluşturur ve hiçbir şey için fazladan bellek tüketir
Tex

20
çekicilik gibi çalıştı, çok hızlı - ekstra bellek kullanımı için takas. parametreleri header=None, index=Nonebaşlık satırı ve dizin sütununu kaldırır.
thepunitsingh

3
@DaveC: commentsAnahtar kelime bağımsız değişkenini şu şekilde ayarlamanız gerekir '', #bastırılacaktır.
Milind R

45

tofile bunu yapmak için uygun bir işlevdir:

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

Kılavuz sayfasının bazı yararlı notları vardır:

Bu, dizi verilerinin hızlı bir şekilde depolanması için bir kolaylık işlevidir. Endianness ve kesinlik bilgileri kaybolur, bu nedenle bu yöntem, verileri arşivlemeyi veya farklı endiannessli makineler arasında veri aktarmayı amaçlayan dosyalar için iyi bir seçim değildir. Bu sorunlardan bazıları, hız ve dosya boyutu pahasına veriler metin dosyaları olarak çıkarılarak aşılabilir.

Not. Bu işlev çok satırlı csv dosyaları üretmez, her şeyi bir satıra kaydeder.


5
Anlayabildiğim kadarıyla, bu bir csv dosyası oluşturmaz, ancak her şeyi tek bir satıra koyar.
Peter

@Peter, iyi bir nokta, teşekkürler, cevabı güncelledim. Benim için csv formatında ok kaydeder (bir satırla sınırlı olsa da). Ayrıca, sorucunun amacının "insan tarafından okunabilir biçimde dökümü" yapmak olduğu açıktır - bu yüzden cevabın alakalı ve yararlı olduğunu düşünüyorum.
atomh33ls

6
Sürüm 1.5.0'dan beri, np.tofile (), çok satırlı çıktıya izin vermek için isteğe bağlı bir newline = '\ n' parametresi alır. docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
Kevin J. Black

2
Aslında, np.savetext () np.tofile () değil, yeni satır argümanı sağlar
eaydin

14

Kayıt dizilerini başlıklı CSV dosyaları olarak yazmak biraz daha fazla çalışma gerektirir.

Bu örnek, ilk satırda başlık bulunan bir CSV dosyasını okur, ardından aynı dosyayı yazar.

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

Bu örneğin virgül içeren dizeleri dikkate almadığını unutmayın. Sayısal olmayan veriler için teklifleri dikkate almak üzere csvpaketi kullanın :

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())

Pandaların tekrar yardım ettiği yer burası. Şunları yapabilirsiniz: pd.DataFrame (dışarı, sütunlar = ['col1', 'col2']), vb.
EFreak

9

Daha önce de tartışıldığı gibi, diziyi bir CSV dosyasına dökmenin en iyi yolu .savetxt(...)yöntem kullanmaktır . Bununla birlikte, düzgün bir şekilde yapmak için bilmemiz gereken bazı şeyler var.

Örneğin, eğer bir numpy dizi var dtype = np.int32olduğu

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

ve kullanma kaydetmek istediğiniz savetxtkadar

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

Verileri kayan nokta üstel biçiminde

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

Sen adında bir parametreyi kullanarak biçimlendirmeyi değiştirmek zorunda kalacak fmtşekilde

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

verileri orijinal biçiminde saklamak için

Verileri Sıkıştırılmış gz biçiminde kaydetme

Ayrıca, verileri ağ üzerinden aktarırken faydalı olabilecek sıkıştırılmış biçimde savetxtsaklamak için kullanılabilir .gz.

Sadece dosyanın uzantısını değiştirmemiz gerekiyor .gzve numpy her şeyi otomatik olarak halledecek

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

Umarım yardımcı olur


1
fmt="%d"Aradığım buydu. Teşekkür ederim!
payne

5

Bunu basitçe şu şekilde yapabileceğinize inanıyorum:

  1. Numpy dizisini bir Panda veri çerçevesine dönüştürme
  2. CSV olarak kaydet

örneğin # 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

örneğin # 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

sütuna yazmak istiyorsanız:

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

Burada 'a' numpy dizisinin adıdır ve 'file' bir dosyaya yazılacak değişkendir.

Satır olarak yazmak istiyorsanız:

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

2

Numpy dizinizi (örn. your_array = np.array([[1,2],[3,4]])) Bir hücreye kaydetmek istiyorsanız , önce onuyour_array.tolist() .

Sonra bir hücreye normal şekilde kaydedin delimiter=';' ve csv dosyasındaki hücre şöyle görünecektir[[1, 2], [2, 4]]

Ardından dizinizi şu şekilde geri yükleyebilirsiniz: your_array = np.array(ast.literal_eval(cell_string))


tam anlamıyla bir numpy dizi kullanmak için tüm bellek tasarruf yok edecek
PirateApp

2

Herhangi bir modül kullanmadan da saf python ile yapabilirsiniz.

# 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
Bu çok fazla bellek kullanır . Her satıra döngü yapmayı tercih edin ve formatlayın ve yazın.
remram

@remram verilerinize bağlıdır, ancak evet büyükse çok fazla bellek kullanabilir
Greg

2

Python'da csv dosyalarına veri yazmak için csv.writer () modülünü kullanıyoruz. Bu modül csv.reader () modülüne benzer.

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()

Sınırlayıcı, alanları ayırmak için kullanılan bir dizedir. Varsayılan değer virgül (,) şeklindedir.


Bu zaten önerildi: stackoverflow.com/a/41009026/8881141 Lütfen yalnızca yeni yaklaşımlar ekleyin, daha önce yayınlanan önerileri tekrarlamayın.
Bay T
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.