Python回溯(最近一次调用last):TypeError:“NoneType”对象没有属性“\uuu getitem\uuu”

Python回溯(最近一次调用last):TypeError:“NoneType”对象没有属性“\uuu getitem\uuu”,python,numpy,typeerror,Python,Numpy,Typeerror,我的代码有如下输出: 0.0 17424.9931038 0.999998852224 0.0 26892.5610797 0.9999992563 0.0 197429.598938 0.999999898698 0.0 206067.715126 0.999999902945 0.0 119901.778166 0.999999833197 0.0 48243.1852781 0.999999585434 0.0 161251.135425 0.99999987597 0.0 460059.

我的代码有如下输出:

0.0
17424.9931038
0.999998852224
0.0
26892.5610797
0.9999992563
0.0
197429.598938
0.999999898698
0.0
206067.715126
0.999999902945
0.0
119901.778166
0.999999833197
0.0
48243.1852781
0.999999585434
0.0
161251.135425
0.99999987597
0.0
460059.512284
0.999999956527
0.0
1616904.64834
0.999999987631
20.0
10048.6928044
0.999998009693
20.0
19783.0112229
0.999998989032
20.0
106444.618031
0.999999812109
20.0
208645.708656
0.999999904144
20.0
85754.2720566
0.999999766775
20.0
35024.1659145
0.999999428966
20.0
162536.879087
0.999999876951
20.0
494504.420369
0.999999959555
20.0
1523905.77844
0.999999986876
40.0
7539.80921955
0.999997347417
40.0
20041.735046
0.999999002083
40.0
58683.4742137
0.999999659189
40.0
234270.969023
0.999999914629
40.0
49306.4157177
0.999999594373
40.0
27876.4404592
0.999999282549
40.0
165300.231338
0.999999879008
40.0
568614.839048
0.999999964827
40.0
1502387.8595
0.999999986688
60.0
4544.45338191
0.99999559904
60.0
21050.154867
0.999999049889
60.0
29282.4962414
0.999999316998
60.0
261564.996448
0.999999923537
60.0
24097.4648119
0.999999170038
...
但随后,它的回溯出现了错误

Traceback (most recent call last):
  File "2_moving.py", line 34, in <module>
    print moving(my_data)
  File "2_moving.py", line 29, in moving
    print dist2(k,l)
  File "2_moving.py", line 16, in dist2
    d2 = math.hypot(m1[0]-m3[0],m1[1]-m3[1])
 TypeError: 'NoneType' object has no attribute '__getitem__'
此文件是代码中的csv文件

这个问题是从数据集中计算影响图
以下是您如何解释此错误:

在Python中,每个操作符都重定向到对象类上的某个特殊函数。在这种情况下,运算符[…]相当于调用u_getitem_uu。对于序列和字典,它都是相同的运算符

问题在于m3。您可以立即知道这一点,因为前一行不会引起m1和m2的错误。m3用于使用nexus函数*在my_数据中搜索m2的某些属性

这通常是可以的,但在某些情况下找不到匹配项。没有显式return语句的每个Python函数的默认返回值都是None,这是在找不到匹配项时nexus不可避免地返回的值

最简单的修复方法是从nexus返回一个序列,即使没有找到匹配项。例如,添加return[0,0]作为函数的最后一行。或者,您可以在dist2中添加对None结果的检查,但随后您必须确定返回什么以及如何在移动中处理它


*我可能应该在某个时候提到,我不知道您的代码真正在做什么,但这不应该影响我回答的准确性。

m1或m3在指示行中没有。@deceze。如果前一行运行,肯定不是m1。我将继续回答您的问题,因为这里有一些概念,我相信对于Python初学者来说是非常不直观的,今天上午我的心情非常好。你已经收到了很多反对票,因为你没有表现出真正的努力来解决这个问题,尽管很明显你可以访问一台有工作互联网连接的计算机和谷歌。数据[x1,y1,t1,p1]表示x轴,y轴,时间框架和人数。我使用m3获得下一帧中出现的人物的数组。所以我使用nexus来获取信息并计算距离d2x,MPi。我也在google和stackoverflow上搜索过,但他们都关注非类型。我知道m1、m2和m3中存在一些错误,但不幸的是我无法修复它。“谢谢你的帮助。”达利万说。在这种情况下,您可以使nexus read的最后一行raise ValueError’Person%d没有出现在下面的帧“%m[p]或类似的帧中。这将比其他地方因不明原因而出现的错误提供更多信息。
import numpy as np
import math

my_data = np.loadtxt(open("demo_tindex.csv","rb"),delimiter=",",skiprows=0)
# print my_data

def nexus(m,n):
    for k in n:
        if k[3] == m[3] and k[2] == m[2]+20:
            return k


def dist2(m1,m2):
    m3 = nexus(m2,my_data)
    d1 = math.hypot(m1[0]-m2[0],m1[1]-m2[1])
    d2 = math.hypot(m1[0]-m3[0],m1[1]-m3[1])
    d3 = math.hypot(m2[0]-m3[0],m2[1]-m3[1])
    dist2 = (d1+d2)**2 - d3**2
    return dist2


def moving(p):
    k = p[0][:]
    theta2 = 0.02

    for l in p[1:]:
        if l[2] == k[2]:
            print l[2]
            print dist2(k,l)
            print math.exp(-theta2/dist2(k,l))
        else:
            k = l

print moving(my_data)