我的代码确实有这样的输出:
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__'
我的代码是
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)
此文件是代码中的csv文件 demo_tindex.csv
这个问题是从数据集计算影响图
答案 0 :(得分:0)
以下是解释此错误的方法:
在Python中,每个操作符都会重定向到对象类的某些特殊函数。在这种情况下,运算符[...]
相当于调用__getitem__
。它对于序列和字典都是相同的运算符。
问题在于m3
。您可以立即知道这一点,因为上一行不会引发m1
和m2
的错误。 m3
使用m2
函数*在my_data
中搜索nexus
的某些属性。
这通常没问题,但在某些情况下找不到匹配项。 每个没有显式return语句的 Python函数的默认返回值是None
,这是nexus
在找不到匹配时不可避免地返回的值。
最简单的解决方法是从nexus
返回序列,即使找不到匹配项也是如此。例如,添加return [0, 0]
作为函数的最后一行。或者,您可以在None
中添加对dist2
结果的检查,但是您必须在moving
中找出要返回的内容以及如何处理它。
*我应该在某些时候提到我不知道你的代码到底在做什么,但这不应该影响我答案的准确性。