函数的Numpy TypeError

时间:2017-12-18 10:03:06

标签: python numpy

我一直在实现一种算法,要求我将从特定点到一组其他点的向量的平均值与其“整合”。因此,我使用此功能:

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))

仍然会产生错误。

1 个答案:

答案 0 :(得分:0)

pointslist 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)