使用对数组列表进行的计算来更新numpy数组

时间:2019-03-15 19:26:27

标签: python numpy

我有一个长度为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)

发生了几件事:

  • 此客户的最终迭代将返回一个全零的列表,但最终元素999除外(对应于上述语句的“ if”部分)。因此,我知道它可以 更新列表,但是在“ else”部分中却没有。
  • 我希望'primaryCustomer'数组以Customer作为索引进行更新,并以每对计算所得的分数作为行值进行更新,但似乎根本没有更新

我所做的任何更改,例如尝试将循环中的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的事情在后台如何工作,因此我想继续弄清楚上面循环中的逻辑。除此之外,任何帮助将不胜感激。

2 个答案:

答案 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个?
  • 您应该考虑以更一般的方式计算距离。即如何使距离计算不受列表大小的影响?
  • 为什么要创建一个初始的0的2D数组来存储距离,然后附加到该距离? thisCustomer列表的创建似乎不是必需的,并且实际上Reedinationer发布的解决方案将其初始化,但甚至从未使用过。而且,正如某人已经说过的那样,np.append也不是这样。最好直接修改最初创建的距离矩阵。
  • 为什么primaryCustomer[a][a] = 999?列表和本身之间的距离不应该为0吗?如果您确实希望将其设置为999,建议您弄清楚如何修改上面的代码块以解决此问题。