Dump een NumPy-array in een csv-bestand

Is er een manier om een NumPy-array in een CSV-bestand te dumpen? Ik heb een 2D NumPy-array en moet deze in een voor mensen leesbaar formaat dumpen.


Antwoord 1, autoriteit 100%

numpy.savetxtslaat een array op in een tekstbestand.

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

Antwoord 2, autoriteit 17%

Je kunt pandasgebruiken. Er is wel wat extra geheugen voor nodig, dus het is niet altijd mogelijk, maar het is erg snel en gemakkelijk te gebruiken.

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

als je geen header of index wilt, gebruik dan to_csv("/path/to/file.csv", header=None, index=None)


Antwoord 3, autoriteit 5%

tofileis een handige functie om dit te doen:

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

De man-pagina bevat enkele nuttige opmerkingen:

Dit is een handige functie voor het snel opslaan van arraygegevens.
Informatie over endianness en precisie gaat verloren, dus deze methode niet
een goede keuze voor bestanden die bedoeld zijn om gegevens te archiveren of gegevens te transporteren
tussen machines met verschillende endianness. Sommige van deze problemen kunnen
worden overwonnen door de gegevens als tekstbestanden uit te voeren, ten koste van
snelheid en bestandsgrootte.

Notitie. Deze functie produceert geen multi-line CSV-bestanden, het bespaart alles op één regel.


Antwoord 4, Autoriteit 2%

Recordarrays schrijven als CSV-bestanden met headers vereist een beetje meer werk.

Dit voorbeeld leest in een CSV-bestand (example.csv) en schrijft de inhoud van een ander CSV-bestand (out.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', encoding='ascii')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i8'), ('col2', '<f8'), ('col3', '<U13')])
# 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', ',')

Merk op dat het bovenstaande voorbeeld de waarden niet aankan die snaren met komma’s zijn. Om altijd niet-numerieke waarden binnen quotes in te voegen, gebruikt u de csvIngebouwde module:

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

Antwoord 5, Autoriteit 2%

Zoals reeds besproken, is de beste manier om de array in een CSV-bestand te dumpen, met behulp van .savetxt(...)methode. Er zijn echter bepaalde dingen die we moeten weten om het goed te doen.

Als u bijvoorbeeld een numpy array hebt met dtype = np.int32als

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

en wil opslaan met savetxtals

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

Het slaat de gegevens op in een exponentieel formaat met drijvende komma als

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

U moet de opmaak wijzigen door een parameter met de naam fmtas

te gebruiken

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

om gegevens in de oorspronkelijke indeling op te slaan

Gegevens opslaan in gecomprimeerde gz-indeling

Ook savetxtkan worden gebruikt voor het opslaan van gegevens in .gzgecomprimeerde indeling, wat handig kan zijn bij het overbrengen van gegevens via het netwerk.

We hoeven alleen de extensie van het bestand te wijzigen als .gzen numpy regelt alles automatisch

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

Hopelijk helpt het


Antwoord 6

Ik geloof dat je dit ook heel eenvoudig als volgt kunt bereiken:

  1. Converteer Numpy-array naar een Pandas-dataframe
  2. Opslaan als CSV

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

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

Antwoord 7

als je in een kolom wilt schrijven:

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

Hier is ‘a’ de naam van numpy array en ‘file’ is de variabele die in een bestand moet worden geschreven.

Als je in een rij wilt schrijven:

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

Antwoord 8

In Python gebruiken we de csv.writer()-module om gegevens naar csv-bestanden te schrijven. Deze module is vergelijkbaar met de csv.reader() module.

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

Een scheidingsteken is een tekenreeks die wordt gebruikt om velden te scheiden. De standaardwaarde is komma(,).


Antwoord 9

Als u uw numpy-array (bijv. your_array = np.array([[1,2],[3,4]])) in één cel wilt opslaan, kunt u deze eerst converteren met your_array.tolist().

Sla het dan op de normale manier op in één cel, met delimiter=';'
en de cel in het csv-bestand ziet er zo uit [[1, 2], [2, 4]]

Dan zou je je array als volgt kunnen herstellen:
your_array = np.array(ast.literal_eval(cell_string))


Antwoord 10

Je kunt het ook doen met pure python zonder modules te gebruiken.

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

Antwoord 11

voor het opslaan van NumPy-array naar tekstbestand importeer eerst de opgeslagen tekst uit de Numpy-module

beschouw de naam van uw Numpy-array als train_df:

from numpy import savetxt
np.savetxt('train_df.txt', train_df, fmt='%s')

Other episodes