web-dev-qa-db-fra.com

Vider un tableau NumPy dans un fichier csv

Est-il possible de vider un tableau NumPy dans un fichier CSV? J'ai un tableau 2D NumPy et je dois le vider dans un format lisible par l'homme.

385
Dexter

numpy.savetxt enregistre un tableau dans un fichier texte.

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

Vous pouvez utiliser pandas. Cela nécessite de la mémoire supplémentaire, ce qui n’est pas toujours possible, mais c’est très rapide et facile à utiliser.

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

si vous ne voulez pas d'en-tête ou d'index, utilisez to_csv("/path/to/file.csv", header=None, index=None)

81
maxbellec

tofile est une fonction pratique pour cela:

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

La page de manuel contient quelques notes utiles:

Ceci est une fonction pratique pour le stockage rapide des données de la matrice . Les informations sur l'endianité et la précision sont perdues, donc cette méthode ne l'est pas un bon choix pour les fichiers destinés à archiver des données ou à transporter des données entre des machines d’endianité différente. Certains de ces problèmes peuvent être surmonté en produisant les données sous forme de fichiers texte, aux dépens de la vitesse et la taille du fichier.

Remarque. Cette fonction ne produit pas de fichiers csv multilignes, elle enregistre tout sur une ligne.

33
atomh33ls

L'écriture de tableaux d'enregistrements sous forme de fichiers CSV avec des en-têtes nécessite un peu plus de travail.

Cet exemple lit un fichier CSV avec l'en-tête sur la première ligne, puis écrit le même fichier.

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

Notez que cet exemple ne considère pas les chaînes avec des virgules. Pour prendre en compte les guillemets pour les données non numériques, utilisez le paquet 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())
11
Mike T

si vous voulez écrire en colonne:

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

Ici 'a' est le nom de numpy array et 'file' est la variable à écrire dans un fichier.

Si vous voulez écrire en ligne:

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

Si vous souhaitez enregistrer votre tableau numpy (par exemple, your_array = np.array([[1,2],[3,4]])) dans une cellule, vous pouvez d'abord le convertir avec your_array.tolist().

Puis enregistrez-le normalement dans une cellule, avec delimiter=';'.__ et la cellule dans le fichier csv ressemblera à ceci [[1, 2], [2, 4]]

Ensuite, vous pouvez restaurer votre tableau comme ceci: your_array = np.array(ast.literal_eval(cell_string))

2
Mr Poin

Comme indiqué précédemment, le meilleur moyen de vider le tableau dans un fichier CSV consiste à utiliser .savetxt(...)method. Cependant, il y a certaines choses que nous devrions savoir pour le faire correctement. 

Par exemple, si vous avez un tableau numpy avec dtype = np.int32 comme

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

et voulez enregistrer en utilisant savetxt comme

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

Il stockera les données au format exponentiel à virgule flottante

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

Vous devrez changer la mise en forme en utilisant un paramètre appelé fmt comme

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

stocker les données dans leur format d'origine

Enregistrement de données au format compressé gz

De plus, savetxt peut être utilisé pour stocker des données dans un format compressé .gz qui peut être utile lors du transfert de données sur le réseau. 

Nous avons juste besoin de changer l'extension du fichier en .gz et numpy s'occupera de tout automatiquement

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

J'espère que ça aide

2
Daksh

Vous pouvez également le faire avec du python pur sans utiliser de modules.

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

En Python, nous utilisons le module csv.writer () pour écrire des données dans des fichiers csv. Ce module est similaire au module 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()

Un délimiteur est une chaîne utilisée pour séparer les champs. La valeur par défaut est une virgule (,).

0
Tamil Selvan S

Je pense que vous pouvez aussi accomplir ceci simplement comme suit:

  1. Convertir un tableau Numpy en un cadre de données Pandas
  2. Enregistrer au format CSV

par exemple. #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

par exemple. # 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
0
DrDEE