我有一个长度为50的列表,其中填充了长度为5的数组。我试图计算列表中每个数组之间的距离,并使用值更新一个numpy数组。
距离计算只是取数组中每个元素之间的平方距离之和的平方根。
当我尝试:
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)
发生了几件事:
我所做的任何更改,例如尝试将循环中的thisCustomer视为数组而不是列表,然后追加到列表中,最终会固定一个区域,而使其他区域更糟。
这是我获取客户数据的方式:
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的事情在后台如何工作,因此我想继续弄清楚上面循环中的逻辑。除此之外,任何帮助将不胜感激。
答案 0 :(得分:1)
我认为这就是您要的目的,但是如果我错了,请纠正我:
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.]]
答案 1 :(得分:1)
首先要注意几件事。
primaryCustomer[a][b] = primaryCustomer[b][a]
,因为您使用的是距离指标。这意味着可以重置两个for循环的范围: 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)
注意*您可以将第二个for循环的范围也更改为从0开始,以保持原始循环结构,但是随后您需要删除转置线。你也可以
primaryCustomer[a][b] = primaryCustomer[b][a] = dist(a,b)
,如果您不想使用移调,但仍避免不必要的计算。
primaryCustomer = np.zeros(shape = (50,50))
用于存储两个客户之间的距离。但是,看起来您有51个客户,而不是50个? thisCustomer
列表的创建似乎不是必需的,并且实际上Reedinationer发布的解决方案将其初始化,但甚至从未使用过。而且,正如某人已经说过的那样,np.append
也不是这样。最好直接修改最初创建的距离矩阵。primaryCustomer[a][a] = 999
?列表和本身之间的距离不应该为0吗?如果您确实希望将其设置为999,建议您弄清楚如何修改上面的代码块以解决此问题。