2016-10-03 6 views
1

Я написал базовый код, который принимает две точечные координаты, получает значение проходящей через него линии и перпендикуляра, а затем выводит две точки, которые являются краями одной и той же перпендикулярной линии. Моя цель - сделать что-то вроде того, что показано на фотографиях this answer, но без всех сторонних пакетов и без ГИС.преобразовать операции python в numpy

Теперь, говоря о производительности, я думаю, что мой код может в значительной степени выиграть от пакета numpy, особенно с учетом использования этих вычислений в цикле с лотами (даже миллионами) пары точечных координат. Так как я не использовал numpy так много, может кто-нибудь:

  1. (подтвердить, что адаптация кода для использования numpy повысит производительность)
  2. как внушал я должен адаптировать код (например, хороший намек, чтобы начать)?

Код, на который было бы удобно. (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() 
+1

Может быть, мы можем избавиться от петель себя для заметного ускорения. Таким образом, было бы полезно увидеть, как вы используете циклы с входными данными. – Divakar

+0

Я читал по одной каждой пары координат из txt-файла. Каждая пара координат является точкой на линии и следующей, на фиксированном расстоянии (прогрессивные точки на линии). Поэтому я бы составил список всех XY-координат (отсортированный), и в цикле я обрабатывал каждую пару отдельно (например, первую и вторую точку (первая пара), затем вторую и третью (вторую пару) и т. Д.), , – umbe1987

ответ

1

1) Да, numpy увеличит производительность. Вместо того, чтобы делать цикл в python, вы используете его в C, используя векторию numpy.

2) идеи:

import matplotlib.pyplot as plt 
import numpy as np 

# get random coords 
npts = 10 
distance_factor = 0.05 
points = (np.sort(np.random.random(2*npts)).reshape((npts,2)) \ 
     + np.random.random((npts,2))/npts).T 
points_x = points[0] # vector of the chain of x coords 
points_y = points[1] # vector of the chain of y coords 
plt.plot(points_x, points_y, 'k-o') 
plt.gca().set_aspect('equal') 
points_x_center = (points_x[1:] + points_x[:-1])*0.5 
points_y_center = (points_y[1:] + points_y[:-1])*0.5 
plt.plot(points_x_center, points_y_center, 'bo') 
ang = np.arctan2(np.diff(points_y), np.diff(points_x)) + np.pi*0.5 
min_X = points_x_center + distance_factor*np.cos(ang) 
min_Y = points_y_center + distance_factor*np.sin(ang) 
max_X = points_x_center - distance_factor*np.cos(ang) 
max_Y = points_y_center - distance_factor*np.sin(ang) 
plt.plot(np.vstack((min_X,max_X)), np.vstack((min_Y,max_Y)), 'r-') 
plt.plot(np.vstack((min_X,max_X)).T, np.vstack((min_Y,max_Y)).T, 'r-', lw=2) 
Смежные вопросы