Общая длина траектории

У меня есть матрица, содержащая 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_'

Я думаю, что проблема исходит от матрицы м. Потому что, видим, что с матрицей A (пример) это дает ожидаемый результат (0.0194054064971)

1 ответ

Кажется, проблема в том, что вы никогда не конвертируете строки из файла в числа с плавающей запятой. Таким образом, ваш массив содержит много строк (которые выглядят как числа, но все еще являются строками), и вы не можете принять разницу строк.

Минимум, чтобы заставить ваш код работать, это изменить эту строку на:

m.append(array([float(ligne[1]), float(ligne[2])]))

Но обратите внимание, что есть и другие незначительные проблемы:

  • Вы инициализируете свой список расстояний с 0, но затем вы добавляете к этим существующим нулям, а не перезаписываете их
  • на самом деле, вам не нужен этот список, просто рассчитайте сумму напрямую
  • вы можете сделать свой код намного проще, используя оператор power ** вместо того, чтобы повторять одно и то же выражение дважды
  • ты можешь использовать 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, как и ожидалось.

Другие вопросы по тегам