Как динамически создать словарь по количеству атрибутов? - PullRequest
1 голос
/ 26 мая 2020

У меня есть CSV-файл с 6 атрибутами и 1 классом, который я читаю с Pandas.

CsvFile = "/path/to/file.csv"
df = pd.read_csv(CsvFile)

Первые 5 строк моего CSV:

x,y,x1,y1,x2,y2,class
92,115,120,94,84,102,3
84,102,106,79,84,102,3
84,102,102,83,80,102,3
80,102,102,79,84,94,3
84,94,102,79,80,94,3

Поскольку у меня 6 атрибутов, я хочу создать словарь в Python (6 ключей, 5 значений для каждого ключа), который будет иметь центроиды для kmeans.

numberOfClusters = 5
centroids =
{
    i+1: [random.uniform(0.0, 255.0), random.uniform(0.0, 255.0),
          random.uniform(0.0, 255.0), random.uniform(0.0, 255.0),
          random.uniform(0.0, 255.0), random.uniform(0.0, 255.0)]
    for i in range(numberOfClusters)
}

Вопрос №1: как вы понимаете, копировать-вставить random.uniform(0.0, 255.0) столько раз, сколько случайных точек, которые я хочу получить, чтобы соответствовать количеству атрибутов в моем CSV-файле, не очень продуктивно. Есть идеи, как это сделать без копирования и вставки?

Подобным образом в следующем коде я вычисляю евклидово расстояние.

for i in centroids.keys():
    df['distance_from_{}'.format(i)] = (
        np.sqrt(
            (df['x'] - centroids[i][0]) ** 2
            + (df['y'] - centroids[i][1]) ** 2
            + (df['x.1'] - centroids[i][2]) ** 2
            + (df['y.1'] - centroids[i][3]) ** 2
            + (df['x.2'] - centroids[i][4]) ** 2
            + (df['y.2'] - centroids[i][5]) ** 2
        )
    )

Вопрос №2: , если у меня больше атрибутов, мне нужно добавить больше df['x'] - centroids[i][0]) ** 2, а если у меня их меньше, удалить один или несколько. Как я могу немного автоматизировать этот процесс? 1021 * 1022

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Первый вопрос: замените свой список на

[random.uniform(0.0, 255.0) for x in range(6)]

Второй вопрос:

np.sqrt(np.sum(np.pow(df[df.columns[:5]] - centroid[i], 2)) should work.
0 голосов
/ 26 мая 2020

Если проблема заключается в количестве ключей, вы можете использовать

n=0
with open('filename.csv','r') as f:
    l=f.readline().strip()
    n=len(l.split(','))

, где n содержит количество ключей

...