Ich bin neu in Python und möchte einen paarweisen Ähnlichkeitsalgorithmus über eine Reihe von Vektoren (vectors.csv) ausführen. Jeder Vektor ist eine Darstellung eines Knotens. Ich habe die Datei vectors.csv, die Folgendes enthält:

    1,2,3
    4,5,6
    7,8,9

Und ich habe eine Liste mit y = [56,76,87], die die Knoten darstellt.

Ich möchte eine CSV-Datei erhalten, die Folgendes enthält:

    null,56,76,87
    56,1,2,3
    76,4,5,6
    87,7,8,9

Was ist der beste Weg, dies in Python3 zu tun?

Die Matrix in der CSV ist ein Numpy-Array.

Jede Hilfe wäre sehr dankbar.

Danke im Voraus!

2
sindhuja 19 Jän. 2019 im 20:53

4 Antworten

Beste Antwort

pandas kann Ihnen helfen.

import pandas as pd
y = [56,76,87]
c=pd.read_csv("vector.csv", names=y)
c.index=y

Dies wird Ihnen Folgendes geben:

    56 76 87
56  1  2  3
76  4  5  6
87  7  8  9

Und Sie exportieren schließlich die neu generierten Daten

c.to_csv('new_file.csv')
0
Fatih1923 19 Jän. 2019 im 20:32

Da Ihre erste Zeile und erste Spalte konzeptionell Beschriftungen darstellen, sollten Sie Pandas in Betracht ziehen, die auf NumPy-Array-Objekten aufbauen:

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')
-1
jpp 19 Jän. 2019 im 18:07

Lassen Sie mich darauf eingehen.

"Die Matrix in der CSV ist ein Numpy-Array."

Nicht unbedingt. Wenn es sich bei Ihrer Datei um eine CSV-Datei handelt, können Sie das CSV-Paket verwenden und Daten wie folgt importieren:

import os
import csv

root = r'C:\path\to\my\csv\file'
input_file_name = r'input_data.csv'
output_file_name = r'new_data.csv'

input_path = os.path.join(root, input_file_name)
output_path = os.path.join(root, output_file_name)

Importieren Sie unsere Daten:

with open(input_path, 'r', newline ='') as f:
    csv_reader = csv.reader(f, delimiter=',')
    data = [i for i in csv_reader]
f.close()

Dann haben Sie eine Liste von Listen (die einem Array ähnelt, aber in Python ein Listendatentyp ist):

[[' 1', '2', '3'], [' 4', '5', '6'], [' 7', '8', '9']]

Hier sind unsere y-Werte, von denen ich angenommen habe, dass sie ganze Zahlen sind:

y = [56,76,87]

Ich habe mir hier eine nützliche Funktion ausgeliehen: Konvertieren von Elementen der Liste verschachtelter Listen Listen von String bis Integer in Python

def int_conversion(my_list):
    return [int(x) if not isinstance(x, list) else int_conversion(x) for x in my_list]

Unsere Funktion führt einige Datentypkonvertierungen durch, gibt jedoch ganzzahlige Werte aus:

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

Verarbeiten und schreiben Sie die Ausgabe:

data = process_data()

with open(output_path, mode='w', newline='') as xyz:
    writer = csv.writer(xyz)
    writer.writerows(data)

Dann sollte Ihre Datei ungefähr so aussehen:

,56,76,87
56,1,2,3
76,4,5,6
87,7,8,9
0
Mark Moretto 19 Jän. 2019 im 19:26

Definieren Sie die Array- und Beschriftungsliste:

In [67]: arr = np.arange(1,10).reshape(3,3)
In [68]: y = [56,76,87]

Verbinden Sie die Beschriftungsliste mit dem Array:

In [69]: arr1 = np.column_stack((y,arr))

Definieren Sie eine Kopfzeile:

In [70]: header = 'null,' + ','.join([str(i) for i in y])
In [71]: header
Out[71]: 'null,56,76,87'

Schreibe mit savetxt. Beachten Sie die Verwendung von Header-, Kommentar- und FMT-Parametern. Spielen Sie bei Bedarf mit denen:

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

savetxt schreibt den Header mit einem Kommentarzeichen. Dann iteriert es über die Zeilen (1. Abmessung) des Array-Arrays. Für jede Zeile wird fmt%tuple(row) geschrieben, wobei fmt von Ihrem Parameter abgeleitet wird. Im Kern handelt es sich also um eine Standard-Python-Datei, die aus formatierten Zeilen schreibt.

0
hpaulj 19 Jän. 2019 im 19:05