Je suis nouveau dans Python et je souhaite exécuter un algorithme de similarité par paires sur un tas de vecteurs (vectors.csv). Chaque vecteur est une représentation d'un nœud. J'ai un fichier vectors.csv qui contient:
null,56,76,87 56,1,2,3 76,4,5,6 87,7,8,9
et j'ai une liste qui a y = [56,76,87] représentant les nœuds.
Je veux obtenir un fichier .csv qui contiendra:
1,2,3 4,5,6 7,8,9
Quelle est la meilleure façon de faire cela en python3?
La matrice dans le csv est un tableau numpy.
Toute aide serait grandement appréciée.
Merci d'avance!
4 Réponses :
Étant donné que, conceptuellement, votre première ligne et votre première colonne représentent des étiquettes , vous voudrez peut-être considérer Pandas, qui s'appuie sur des objets de tableau NumPy:
import pandas as pd from io import StringIO x = """1,2,3 4,5,6 7,8,9""" # read data; replace StringIO(x) with 'file.csv' df = pd.read_csv(StringIO(x), header=None) # define column and index properties idx = [56,76,87] df.columns = idx df.index = idx # export to csv df.to_csv('out.csv')
pandas
peut vous aider.
c.to_csv('new_file.csv')
cela vous donnera:
56 76 87 56 1 2 3 76 4 5 6 87 7 8 9
et vous enfin exporter les données nouvellement générées
import pandas as pd y = [56,76,87] c=pd.read_csv("vector.csv", names=y) c.index=y
Définissez le tableau et la liste d'étiquettes:
In [72]: np.savetxt('test.txt', arr1,header=header, fmt='%d',delimiter=',',comments='') In [73]: cat test.txt null,56,76,87 56,1,2,3 76,4,5,6 87,7,8,9
joignez la liste d'étiquettes au tableau:
In [70]: header = 'null,' + ','.join([str(i) for i in y]) In [71]: header Out[71]: 'null,56,76,87'
définissez une ligne d'en-tête: p>
In [69]: arr1 = np.column_stack((y,arr))
écrire avec savetxt
. Notez l'utilisation de l'en-tête, des commentaires et des paramètres fmt. Jouez avec ceux-ci si nécessaire:
In [67]: arr = np.arange(1,10).reshape(3,3) In [68]: y = [56,76,87]
savetxt
écrit l'en-tête avec le caractère de commentaire. Ensuite, il itère sur les lignes (1er dim) du tableau. Pour chaque ligne, il effectue une écriture fmt% tuple (row)
, où fmt
est dérivé de votre paramètre. Donc, à la base, c'est une écriture de fichier Python standard de lignes formatées.
Permettez-moi de répondre à ceci.
"La matrice dans le csv est un tableau numpy."
Pas nécessairement. Si votre fichier est un fichier .csv, vous pouvez utiliser le package csv et importer des données comme ceci:
,56,76,87 56,1,2,3 76,4,5,6 87,7,8,9
Importez nos données:
data = process_data() with open(output_path, mode='w', newline='') as xyz: writer = csv.writer(xyz) writer.writerows(data)
Ensuite, vous aurez une liste de listes (qui est comme un tableau, mais est un type de données de liste en Python):
def process_data(my_data=data): # copy the raw data list new_data = my_data # Convert our y values to stings for processing y_1 = [str(i) for i in y] # Insert each value of our y list at the first spot in each sublist for i in range(len(my_data)): new_data[i].insert(0, y_1[i]) # Insert a '0' placeholder at the start of our y list y_1.insert(0, '0') # Insert the y list as a sublist in our main data list new_data.insert(0, y_1) # Convert the list values to integers new_data = int_conversion(new_data) # Replace the first value in the first sublist with a null (None) value new_data[0][0] = None # Return the results return new_data
Voici nos valeurs y, que je supposais être des entiers:
def int_conversion(my_list): return [int(x) if not isinstance(x, list) else int_conversion(x) for x in my_list]
J'ai emprunté une fonction utile à partir d'ici: Conversion des éléments de la liste des imbriqués listes d'une chaîne à un entier en python
y = [56,76,87]
Notre fonction effectue une conversion de type de données, mais génère des valeurs entières:
[[' 1', '2', '3'], [' 4', '5', '6'], [' 7', '8', '9']]
Joignez la liste au tableau (concaténer), puis utilisez
savetxt
sur le nouveau tableau.Vous pouvez utiliser
pandas.DataFrame (matrix, index = [56,76,87], columns = [56,76,87])
. Dans numpy, ce sera un peu gênant car le[0, 0]
est manquant et je suppose que vous ne voulez pas exécuter de calculs sur les identifiants de nœud.