2017-02-04 4 views
-1

У меня есть набор данных в питоне любит:Как построить парные расстояния двумерных векторов?

x y angle 

Если я хочу, чтобы вычислить расстояние между двумя точками со всей возможной величиной и построить расстояния с разницей между двумя углами.

x, y, a = np.loadtxt('w51e2-pa-2pk.log', unpack=True) 
n = 0 
f=(((x[n])-x[n+1:])**2+((y[n])-y[n+1:])**2)**0.5 
d = a[n]-a[n+1:] 
plt.scatter(f,d) 

В моих данных 255 пунктов.

f это расстояние и d - разница между двумя углами. Вопрос в том, могу ли я установить n = [1,2,3,.....255] и выполнить расчет снова, чтобы получить f и d из всех возможных пар?

+0

Итак, если я правильно понимаю, вы хотите способ рассчитать 255x255 различные возможности для вычисления расстояния/углы между каждая точка (может быть, за исключением самой фактической точки)? – Alex

+0

Да! Но есть (255x255)/2 различных возможностей. – larry

+0

Да, вы правы ... – Alex

ответ

0

Вам необходимо использовать цикл for и range() для итерации по n, например. как например:

n = len(x) 

for i in range(n): 
    # do something with the current index 
    # e.g. print the points 
    print x[i] 
    print y[i] 

Но обратите внимание, что если вы используете i+1 внутри последней итерации, это будет уже за пределами списка.

Также в вашем расчете есть ошибки. (x[n])-x[n+1:] не работает, потому что x[n] - это единственное значение в вашем списке, а x[n+1:] - это список, начинающийся с n+1. Вы не можете вычитать список из int или что бы это ни было.

Возможно, вам придется использовать два вложенных цикла, чтобы делать то, что вы хотите. Я предполагаю, что вы хотите рассчитать расстояние между каждой точкой, поэтому двухмерным массивом может быть структура данных, которую вы хотите.

+0

Вам не нужны никакие явные петли; поскольку мы имеем дело с массивами 'numpy', операция может быть векторизована. – fuglede

0

Если вас интересуют все комбинации пунктов в x и y Предлагаю использовать itertools, что даст вам все возможные комбинации. После этого вы можете сделать это следующим образом:

import itertools 

f = [((x[i]-x[j])**2 + (y[i]-y[j])**2)**0.5 for i,j in itertools.product(255,255) if i!=j] 
# and similar for the angles 

Но, может быть, есть еще более простой способ ...

+0

Это не работает. Он показывает, что «TypeError: объект« int »не является итерируемым». Понятия не имею ... – larry

1

Вы можете получить попарные расстояния через broadcasting, рассматривая его в качестве внешней операции на массиве 2 мерные векторы следующим образом:

vecs = np.stack((x, y)).T 
np.linalg.norm(vecs[np.newaxis, :] - vecs[:, np.newaxis], axis=2) 

Например,

In [1]: import numpy as np 
    ...: x = np.array([1, 2, 3]) 
    ...: y = np.array([3, 4, 6]) 
    ...: vecs = np.stack((x, y)).T 
    ...: np.linalg.norm(vecs[np.newaxis, :] - vecs[:, np.newaxis], axis=2) 
    ...: 
Out[1]: 
array([[ 0.  , 1.41421356, 3.60555128], 
     [ 1.41421356, 0.  , 2.23606798], 
     [ 3.60555128, 2.23606798, 0.  ]]) 

Здесь (я, J) -м запись расстояние между я -м и J -м векторов.

Случай попарных различий между углами аналогично, но проще, так как у вас есть только одно измерение, чтобы иметь дело с:

In [2]: a = np.array([10, 12, 15]) 
    ...: a[np.newaxis, :] - a[: , np.newaxis] 
    ...: 
Out[2]: 
array([[ 0, 2, 5], 
     [-2, 0, 3], 
     [-5, -3, 0]]) 

Кроме того, plt.scatter не заботится о том, что результаты представлены в виде матриц, и положить все вместе, используя обозначения этого вопроса, вы можете получить график углов на расстояния, делая что-то вроде

vecs = np.stack((x, y)).T 
f = np.linalg.norm(vecs[np.newaxis, :] - vecs[:, np.newaxis], axis=2) 
d = angle[np.newaxis, :] - angle[: , np.newaxis] 
plt.scatter(f, d) 
+0

Мне нравится этот ответ ... – Alex

+0

Это не работает! Он показывает «ValueError: x и y должен быть того же размера», но я уверен, что x и y имеют одинаковую длину. – larry

+0

ahh! Я сделал это ! Спасибо! – larry