我有一个包含2列的矩阵,这些列对应于轨迹中点的坐标(x,y)。我想用欧氏距离来计算轨迹的总长度。
首先,我打开我的轨迹文件
fichier="fichier_position_2_test.txt"
file = open(fichier, "rb")
for ligne in file:
ligne = ligne.split(' ')
m.append(array([(ligne[1]),(ligne[2])]))
然后我计算矩阵中两点之间的欧氏距离
def T(mat):
n=len(mat)
M=[0 for x in range(mat)]
for j in range(0,n-1):
val = sqrt((mat[j+1][0]-mat[j][0])*(mat[j+1][0]-mat[j][0]) + (mat[j+1][1]-mat[j][1])*(mat[j+1][1]-mat[j][1]))
M.append(val)
L = sum(M)
return L
然而,它并没有那么好用
这是我的档案 http://s000.tinyupload.com/?file_id=26745790747175243934
以下是一些测试
#TEST
A = array([(-4e-9,7.2e-6),(-5.7e-4,3.7e-4),(-8.7e-3,5.7e-3),(-1.2e-3,7.1e-4)])
print T(A)
print T(m)
结果
0.0194054064971
Traceback (most recent call last):
File "tortuosity.py", line 46, in <module>
print T(m)
File "tortuosity.py", line 37, in T
val = sqrt((mat[j+1][0]-mat[j][0])*(mat[j+1][0]-mat[j][0]) + (mat[j+1][1]-mat[j][1])*(mat[j+1][1]-mat[j][1]))
TypeError: unsupported operand type(s) for -: 'numpy.string_' and 'numpy.string_'
我认为问题来自矩阵m。因为,看到矩阵A(一个例子)它给出了预期的结果(0.0194054064971)
答案 0 :(得分:2)
问题似乎是你永远不会将字符串从文件转换为浮点数。因此,你的数组包含很多字符串(看起来像数字,但仍然是字符串),你不能区分字符串。
使代码工作的最小值是将此行更改为:
m.append(array([float(ligne[1]), float(ligne[2])]))
但请注意,还有其他一些小问题:
0
初始化距离列表,但是您会附加到那些现有的零,而不是覆盖它们**
而不是重复相同的表达式,使代码更简单zip(list, list[1:])
来迭代成对的连续行with
打开文件,不要将file
用作变量名称,因为它会影响类型总而言之,您可以使代码更紧凑:
def T(mat):
return sum( sqrt((y2-y1)**2 + (x2-x1)**2) for (x1, y1), (x2, y2) in zip(mat, mat[1:]))
with open("fichier_position_2_test.txt") as f:
m = np.array([(float(items[1]), float(items[2])) for items in (line.split() for line in f)])
print T(m)
m
的结果为0.00132038721131
,而A
的结果为0.0194054064971
,符合预期。