如何绘制二维向量的成对距离?

时间:2017-02-04 13:48:00

标签: python numpy matplotlib plot

我在python中有一组数据:

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]并再次进行计算,以获得所有可能对的fd吗?

3 个答案:

答案 0 :(得分:1)

您可以通过broadcasting获取成对距离,将其视为二维向量数组的外部操作,如下所示:

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.        ]])

这里,( i j )'条目是 i '和 j之间的距离'th vectors。

角度之间成对差异的情况类似,但更简单,因为您只有一个维度可以处理:

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)

答案 1 :(得分: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或其他任何内容中减去列表。

也许你甚至不得不使用两个嵌套循环来做你想要的。我想你想计算每个点之间的距离,所以二维数组可能是你想要的数据结构。

答案 2 :(得分:0)

如果您对xy中各点的所有组合感兴趣,我建议使用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

但也许有更简单的方法......