我有一个长度为50的列表。>
距离计算只是将阵列中每个元素之间平方距离之和的平方根。
我尝试时:
primaryCustomer = np.zeros(shape = (50,50))
for customer in range(0,50):
for pair in range(0,50):
thisCustomer = [0 for i in range(51)]
if customer == pair:
thisCustomer[pair] = 999
else:
calculateScores = (((Customer[customer][0]-Customer[pair][0])**2
+ (Customer[customer][1]-Customer[pair][1])**2
+ (Customer[customer][2]-Customer[pair][2])**2
+ (Customer[customer][3]-Customer[pair][3])**2
+ (Customer[customer][4]-Customer[pair][4])**2 )**(0.5))
thisCustomer[pair] = calculateScores
np.append(primaryCustomer, thisCustomer)
发生了几件事:
- 此customer的最终迭代返回所有零的列表,除了999的最终元素(对应于上面的语句的" if"部分)。因此,我知道它 can 更新列表,但它不在"其他"部分中进行。
- 我希望" priendarcustomer"数组与客户更新为索引,并以每对作为行值的所有计算得分,但似乎根本没有更新
我所做的任何更改,例如试图将循环中的此customer视为数组而不是列表并附加到它,最终将一个区域修复,但使其他区域更糟。
这是我获取客户数据的方式:
Customer = [[0,0,0,0,0] for i in range(51)]
for n in range(51):
Customer[n] = np.ones(5)
Customer[n][randint(2,4):5] = 0
np.random.shuffle(Customer[n])
我知道可能有包装的方法可以做到这一点,但是我试图了解KNN之类的工作在后台工作,因此我想继续弄清楚循环中的逻辑。除此之外,任何帮助都将不胜感激。
i 以为这是您要的目标,但是如果我错了,请纠正我:
import numpy as np
from random import randint
Customer = [[0, 0, 0, 0, 0] for i in range(51)]
for n in range(51):
Customer[n] = np.ones(5)
Customer[n][randint(2, 4):5] = 0
np.random.shuffle(Customer[n])
primaryCustomer = np.zeros(shape=(50, 50))
for customer in range(0, 50):
thisCustomer = [0 for i in range(51)]
for pair in range(0, 50):
if customer == pair:
primaryCustomer[customer][pair] = 999
else:
calculateScores = (((Customer[customer][0] - Customer[pair][0]) ** 2
+ (Customer[customer][1] - Customer[pair][1]) ** 2
+ (Customer[customer][2] - Customer[pair][2]) ** 2
+ (Customer[customer][3] - Customer[pair][3]) ** 2
+ (Customer[customer][4] - Customer[pair][4]) ** 2) ** 0.5)
primaryCustomer[customer][pair] = calculateScores
print(primaryCustomer)
我认为我在您的循环中发现的主要问题是thisCustomer = [0 for i in range(51)]
的位置,我认为您的意思是将其像我的那样提高一个水平。但是,我不认为这线需要任何需要,而是更改了thisCustomer[pair]
直接写入primaryCustomer[customer][pair]
,从而否定了对thisCustomer = [0 for i in range(51)]
每个环的需求,这将加快您的程序加快您的程序并通过完全删除线路来改善内存使用。
样本输出:
[[999。2.23606798 1. ... 2. 0。 1.73205081] [2.23606798 999. 2. ... 1. 2.23606798 1.41421356] [1. 2. 999. ... 1.73205081 1。 2.]] ... [2. 1. 1.73205081 ... 999. 2。 1.73205081] [0. 2.23606798 1. ... 2. 999。 1.73205081] [1.73205081 1.41421356 2. ... 1.73205081 1.73205081 999.]
首先要注意的几件事。
-
primaryCustomer[a][b] = primaryCustomer[b][a]
,因为您使用的是距离度量。这意味着可以重置两个循环的范围:
numCustomers = 51
primaryCustomer = np.zeros(shape = (numCustomers, numCustomers))
for customerA in range(numCustomers-1):
for customerB in range(customerA+1, numCustomers):
primaryCustomer[customerA][customerB] = dist(customerA,customerB)
primaryCustomer += np.transpose(primaryCustomer)
注意*您可以更改循环范围的第二个,也可以从0开始,以保持原始循环结构,但是您需要删除转换线。你也可以 primaryCustomer[a][b] = primaryCustomer[b][a] = dist(a,b)
如果您不想使用换位,但仍然避免不必要的计算。
-
primaryCustomer = np.zeros(shape = (50,50))
我假设是为了存储两个客户之间的距离。但是,看来您有51个客户,而不是50个客户? - 您应该考虑以更一般的方式计算距离。即,如何使距离计算独立于列表大小?
- 为什么要创建一个初始的2D数组0s来存储距离,然后附加到它?
thisCustomer
列表的创建似乎并不是必需的,实际上,Reedinationer发布的解决方案将其初始化,甚至从未使用。另外,正如某人已经说过的那样,这不是np.append
的工作方式。最好是修改最初创建的距离矩阵。 - 为什么
primaryCustomer[a][a] = 999
?列表和本身之间的距离不应该是0吗?如果您确实想拥有999,我鼓励您弄清楚如何修改上面的代码块以说明。