[英]Python - dynamically create number of key:values in a new dictionary, based on given number of key:values from another dictionary
[英]How to create a dictionary dynamically based on number of attributes?
我有一個帶有 6 個屬性和 1 個 class 的 CSV 文件,我使用 Pandas 讀取了該文件。
CsvFile = "/path/to/file.csv"
df = pd.read_csv(CsvFile)
我的 CSV 的前 5 行:
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)
}
問題 nr.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
)
)
問題 nr.2:如果我有更多屬性,我必須添加更多df['x'] - centroids[i][0]) ** 2
,而如果我有更少,則刪除一個或多個。 我怎樣才能使這個過程自動化一點?
不使用 scikit 的 kmeans 的原因是我想計算每個集群的權重。
如果鍵數是您可以使用的問題
n=0
with open('filename.csv','r') as f:
l=f.readline().strip()
n=len(l.split(','))
其中 n 保存鍵的數量
第一個問題:將您的列表替換為
[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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.