我一直在实现一种算法,要求我将从特定点到一组其他点的向量的平均值与其“整合”。因此,我使用此功能:
import numba
import numpy
def dist(a,b):
return ((a[0]-b[0])**2+(a[1]-b[1])**2)**0.5
@jit
def point_average(o, points):
vectors = np.zeros((2,len(points)))
for i in range(0,len(points)):
vectors[0,i] = (points[i,0]-o[0])/dist(i,o)
vectors[1,i] = (points[i,1]-o[1])/dist(i,o)
vector = (np.sum(vectors[0]),np.sum(vectors[1]))
d = dist(vector,(0,0))
return (o[0]+vector[0]/d,o[1]+vector[1]/d)
但是,当在一个名为tree()的较大函数中调用此函数时,我得到一个TypeError:
Traceback (most recent call last):
File "C:\Users\Isky\Documents\IT\Programs\SpaceColonisation.py", line 81, in <module>
tree()
File "C:\Users\Isky\Documents\IT\Programs\SpaceColonisation.py", line 67, in tree
n = point_average(j, l)
TypeError: list indices must be integers or slices, not tuple
现在,它不喜欢的第81行声明是
n = point_average(j, l)
其中“l”是一个点列表,“j”是一个名为“nodes”的列表中的一个点,两者都表示为像(x,y)这样的元组。
为什么我收到此错误? numpy认为point_average()是一个数组,我试图用元组索引它吗?
编辑:
正如有用的指出,我应该包括一个MCVE,所以这里有一个。我打印出“j”和“l”所以我们有:
j = (0,0)
l = [np.array([ 40.79669845, 23.10185075]), np.array([ 1.29143263, -25.70311497]), np.array([-10.31449425, -45.78984709]), np.array([ 1.21100438, 32.65835732]), np.array([ 13.69990749, 13.11397896]), np.array([ 37.84780568, 27.06853658])]
print(point_average(j,l))
仍然会产生错误。
答案 0 :(得分:0)
points
是list
arrays
,不是2D array
。因此你无法做到
points[i, 0]
你只能这样做
points[i][0]
此外,如果你因此使用NumPy数组而不是列表和数组,你根本不需要Numba:
def point_average(o, points):
vectors = (points - o) / numpy.linalg.norm(points - o, axis=1, keepdims=True)
vector = np.sum(vectors, axis=0)
d = numpy.linalg.norm(vector)
return o + vector / d
j = np.zeros(2)
l = np.array([
[ 40.79669845, 23.10185075],
[ 1.29143263, -25.70311497],
[-10.31449425, -45.78984709],
[ 1.21100438, 32.65835732],
[ 13.69990749, 13.11397896],
[ 37.84780568, 27.06853658]
])
point_average(j, l)