Я написал базовый код, который принимает две точечные координаты, получает значение проходящей через него линии и перпендикуляра, а затем выводит две точки, которые являются краями одной и той же перпендикулярной линии. Моя цель - сделать что-то вроде того, что показано на фотографиях this answer, но без всех сторонних пакетов и без ГИС.преобразовать операции python в numpy
Теперь, говоря о производительности, я думаю, что мой код может в значительной степени выиграть от пакета numpy
, особенно с учетом использования этих вычислений в цикле с лотами (даже миллионами) пары точечных координат. Так как я не использовал numpy
так много, может кто-нибудь:
- (подтвердить, что адаптация кода для использования
numpy
повысит производительность) - как внушал я должен адаптировать код (например, хороший намек, чтобы начать)?
Код, на который было бы удобно. (matplotlib
есть возможность визуализировать результат).
import matplotlib.pyplot as plt
# calculate y from X coord, slope and intercept
def calculate_y(x, m, q):
y = m * x + q
return y
# the two point coordinates
point_A = [5,7] # First considered point
point_B = [4,10] # Second considered point
# calculate the slope between the point pair
m = (point_A[1] - point_B[1])/(point_A[0] - point_B[0])
# calculate slope and intercept of the perpendicular (using the second original point)
m_perp = -(1/m)
q_perp = point_B[1] - m_perp * point_B[0]
##print "Perpendicular Line is y = {m}x + {q}".format(m=m_perp,q=q_perp)
# calculate corods of the perpendicular line
distance_factor = 1 #distance from central point
min_X = point_B[0] - distance_factor # left-side X
min_Y = calculate_y(min_X, m_perp, q_perp) # left-side Y
max_X = point_B[0] + distance_factor # right-side X
max_Y = calculate_y(max_X, m_perp, q_perp) # right-side Y
perp_A = (min_X, min_Y)
perp_B = (max_X, max_Y)
x_coord, y_coord = zip(*[point_A, point_B])
x_perp_coord, y_perp_coord = zip(*[perp_A, perp_B])
plt.scatter(x_coord, y_coord)
plt.scatter(x_perp_coord, y_perp_coord)
plt.show()
Может быть, мы можем избавиться от петель себя для заметного ускорения. Таким образом, было бы полезно увидеть, как вы используете циклы с входными данными. – Divakar
Я читал по одной каждой пары координат из txt-файла. Каждая пара координат является точкой на линии и следующей, на фиксированном расстоянии (прогрессивные точки на линии). Поэтому я бы составил список всех XY-координат (отсортированный), и в цикле я обрабатывал каждую пару отдельно (например, первую и вторую точку (первая пара), затем вторую и третью (вторую пару) и т. Д.), , – umbe1987