【问题标题】:Total length of a trajectory轨迹的总长度
【发布时间】:2015-06-22 08:06:08
【问题描述】:

我有一个包含 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)

【问题讨论】:

    标签: python euclidean-distance


    【解决方案1】:

    问题似乎是您永远不会将文件中的字符串转换为浮点数。因此,您的数组包含很多字符串(看起来像数字,但仍然是字符串),您无法区分字符串。

    使您的代码工作的最低要求是将这一行更改为:

    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.00132038721131A 的结果是 0.0194054064971,正如预期的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多