Speichern Sie ein NumPy-Array in einer CSV-Datei

545

Gibt es eine Möglichkeit, ein NumPy-Array in eine CSV-Datei zu kopieren? Ich habe ein 2D-NumPy-Array und muss es in einem für Menschen lesbaren Format ausgeben.

Dexter
quelle

Antworten:

866

numpy.savetxt speichert ein Array in einer Textdatei.

import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")
Jim Brissom
quelle
2
Wird dies dem Durchlaufen des Arrays nach Dimension vorgezogen? Ich denke so.
Ehtesh Choudhury
51
Sie können auch das Format jeder Figur mit dem Schlüsselwort fmt ändern. Die Standardeinstellung ist '% .18e'. Dies kann schwer zu lesen sein. Sie können '% .3e' verwenden, sodass nur 3 Dezimalstellen angezeigt werden.
Andrea Zonca
3
Andrea, ja, ich habe% 10.5f verwendet. Es war ziemlich praktisch.
Dexter
12
Ihre Methode funktioniert gut für numerische Daten, wirft jedoch einen Fehler für numpy.arrayZeichenfolgen aus. Könnten Sie eine Methode zum Speichern als CSV für ein numpy.arrayObjekt mit Zeichenfolgen vorschreiben ?
Ébe Isaac
16
@ ÉbeIsaac Sie können das Format auch als Zeichenfolge angeben:fmt='%s'
Luis
136

Sie können verwenden pandas. Es braucht etwas zusätzlichen Speicher, so dass es nicht immer möglich ist, aber es ist sehr schnell und einfach zu bedienen.

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

Wenn Sie keinen Header oder Index möchten, verwenden Sie to_csv("/path/to/file.csv", header=None, index=None)

maxbellec
quelle
4
Dadurch wird jedoch auch ein Spaltenindex in die erste Zeile geschrieben.
RM
5
@ RM- können Sie verwendendf.to_csv("file_path.csv", header=None)
maxbellec
4
Nicht gut. Dies erstellt eine df und verbraucht zusätzlichen Speicher für nichts
Tex
20
hat wie ein Zauber funktioniert, es ist sehr schnell - Kompromiss für zusätzliche Speichernutzung. Parameter header=None, index=Noneentfernen Kopfzeile und Indexspalte.
Thepunitsingh
3
@ DaveC: Sie müssen das commentsSchlüsselwortargument auf setzen '', das #wird unterdrückt.
Milind R
45

tofile ist eine bequeme Funktion, um dies zu tun:

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

Die Manpage enthält einige nützliche Hinweise:

Dies ist eine praktische Funktion zum schnellen Speichern von Array-Daten. Informationen zu Endianness und Präzision gehen verloren, daher ist diese Methode keine gute Wahl für Dateien, die Daten archivieren oder Daten zwischen Maschinen mit unterschiedlicher Endianness transportieren sollen. Einige dieser Probleme können überwunden werden, indem die Daten auf Kosten der Geschwindigkeit und der Dateigröße als Textdateien ausgegeben werden.

Hinweis. Diese Funktion erzeugt keine mehrzeiligen CSV-Dateien, sondern speichert alles in einer Zeile.

atomh33ls
quelle
5
Soweit ich das beurteilen kann, wird hierdurch keine CSV-Datei erstellt, sondern alles in einer einzigen Zeile.
Peter
@ Peter, guter Punkt, danke, ich habe die Antwort aktualisiert. Für mich ist es im CSV-Format in Ordnung (wenn auch auf eine Zeile beschränkt). Es ist auch klar, dass der Fragesteller beabsichtigt, "es in einem für Menschen lesbaren Format abzulegen" - daher denke ich, dass die Antwort relevant und nützlich ist.
Atomh33ls
6
Seit Version 1.5.0 verwendet np.tofile () einen optionalen Parameter newline = '\ n', um eine mehrzeilige Ausgabe zu ermöglichen. docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
Kevin J. Black
2
Tatsächlich liefert np.savetext () das Argument newline, nicht np.tofile ()
eaydin
14

Das Schreiben von Datensatz-Arrays als CSV-Dateien mit Headern erfordert etwas mehr Arbeit.

In diesem Beispiel wird eine CSV-Datei mit dem Header in der ersten Zeile gelesen und anschließend dieselbe Datei geschrieben.

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

Beachten Sie, dass in diesem Beispiel keine Zeichenfolgen mit Kommas berücksichtigt werden. Verwenden Sie das csvPaket , um Anführungszeichen für nicht numerische Daten zu berücksichtigen :

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.
quelle
Hier hilft wieder Pandas. Sie können Folgendes tun: pd.DataFrame (out, column = ['col1', 'col2']) usw.
EFreak
9

Wie bereits erläutert, können Sie das Array am besten mithilfe einer .savetxt(...)Methode in eine CSV-Datei sichern. Es gibt jedoch bestimmte Dinge, die wir wissen sollten, um es richtig zu machen.

Zum Beispiel, wenn Sie ein numpy-Array mit dtype = np.int32as haben

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

und möchten mit savetxtals speichern

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

Die Daten werden im Gleitkomma-Exponentialformat als gespeichert

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

Sie müssen die Formatierung ändern , indem Sie einen Parameter namens fmtals

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

um Daten im Originalformat zu speichern

Speichern von Daten im komprimierten gz-Format

Auch savetxtkann zum Speichern von Daten in verwendetem .gzkomprimiertem Format , das während nützlich sein könnte Daten über das Netzwerk übertragen werden .

Wir müssen nur die Erweiterung der Datei ändern, da .gznumpy sich automatisch um alles kümmert

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

Ich hoffe es hilft

Daksh
quelle
1
Das fmt="%d"war was ich suchte. Vielen Dank!
Payne
5

Ich glaube, Sie können dies auch ganz einfach wie folgt erreichen:

  1. Konvertieren Sie das Numpy-Array in einen Pandas-Datenrahmen
  2. Als CSV speichern

zB # 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

zB # 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
quelle
4

Wenn Sie in eine Spalte schreiben möchten:

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

Hier ist 'a' der Name des Numpy-Arrays und 'file' ist die Variable, die in eine Datei geschrieben werden soll.

Wenn Sie in Reihe schreiben möchten:

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

Wenn Sie Ihr numpy-Array (z. B. your_array = np.array([[1,2],[3,4]])) in einer Zelle speichern möchten , können Sie es zuerst mit konvertieren your_array.tolist().

Speichern Sie es delimiter=';' dann wie gewohnt in einer Zelle mit, und die Zelle in der CSV-Datei sieht folgendermaßen aus[[1, 2], [2, 4]]

Dann könnten Sie Ihr Array folgendermaßen wiederherstellen: your_array = np.array(ast.literal_eval(cell_string))

Herr Poin
quelle
Nun, das wird buchstäblich alle Speichereinsparungen für die Verwendung eines Numpy-Arrays
zerstören
2

Sie können dies auch mit reinem Python tun, ohne Module zu verwenden.

# 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
quelle
1
Dies verbraucht viel Speicher . Ziehen Sie es vor, jede Zeile zu durchlaufen und zu formatieren und zu schreiben.
Remram
@remram es hängt von Ihren Daten ab, aber ja, wenn es groß ist, kann es viel Speicher verbrauchen
Greg
2

In Python verwenden wir das Modul csv.writer (), um Daten in CSV-Dateien zu schreiben. Dieses Modul ähnelt dem 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()

Ein Trennzeichen ist eine Zeichenfolge, mit der Felder getrennt werden. Der Standardwert ist Komma (,).

Tamil Selvan S.
quelle
Dies wurde bereits vorgeschlagen: stackoverflow.com/a/41009026/8881141 Bitte fügen Sie nur neue Ansätze hinzu, wiederholen Sie keine zuvor veröffentlichten Vorschläge.
Mr. T