Общая длина траектории
У меня есть матрица, содержащая 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
, как и ожидалось.