Python,两点之间的距离类型问题

时间:2016-07-23 11:16:57

标签: python list numpy types

我试图使用 numpy 在x和y轴上的0到100之间的笛卡尔网格上的100个随机点的旅行商问题的解决方案的简单近似方法

我创建了各种独特的整数并填充了三个列表:

xList = [np.round(np.random.rand()*100)] #Generates random x,y coordinates
yList = [np.round(np.random.rand()*100)]
orderList = [np.round(np.random.rand()*100)]

我已经定义了一个函数,可以找到笛卡尔平面上两点之间的最短距离:

def distance(x1, x2, y1, y2):
    return np.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))

然后我遍历此列表以查找特定路径在点之间随机传播的总长度:

totalLength = 0

for i in range(0, 98):
    stuff = distance(int(xList[orderList[i]]), int(xList[orderList[i+1]]), int(yList[orderList[i]]), int(yList[orderList[i+1]]))
totalLength = totalLength + stuff

shortestLength = totalLength

似乎打字是我的预定义函数获取消息的问题:

stuff = distance(int(xList[orderList[i]]), int(xList[orderList[i+1]]), int(yList[orderList[i]]), int(yList[orderList[i+1]]))***

TypeError: list indices must be integers, not numpy.float64

我不知道如何在python中正确定义类型,所以我想要一些关于将float.numpy64类型转换为整数或允许我的预定义函数适用于正确类型的建议。

2 个答案:

答案 0 :(得分:0)

numpy.round不会产生整数:

> print(type(np.round(13.4)))
<type 'numpy.float64'>

可能的解决方案:

> int(np.round(13.4))
13 # type int
> np.int(13.4)
13 # type int
> math.trunc(13.4)
13 # type int

请考虑以下重构代码:

import numpy as np
import random
import scipy.spatial.distance as distance

points = np.rollaxis(np.random.randn(2, 100), 1)
indices = range(points.size)

# distance.euclidean(points[5], points[10])

答案 1 :(得分:0)

你的orderList应该是一个整数的numpy数组(或普通的Python列表),而不是随机的浮点数。

我认为它应该是0到100范围内的混合数字列表。您可以在纯Python中构建这样的列表,如下所示:

import random

listsize = 10
orderList = list(range(listsize))
random.shuffle(orderList)
print(orderList)    

典型输出

[6, 5, 1, 2, 0, 4, 9, 3, 7, 8]

(我已将listsize设置为10以保持输出小。)

您还可以将Numpy数组传递给random.shuffle

import random
import numpy as np

listsize = 10
orderList = np.arange(listsize)
random.shuffle(orderList)
print(orderList)        

典型输出

[6 9 0 1 3 7 2 5 8 4]

orderList元素的 dtype 是int32。

实际上,Numpy有自己的random.shuffle功能,因此您可以使用

替换上一个代码段中的random.shuffle(orderList)
np.random.shuffle(orderList)