2017-02-04 91 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]并再次进行计算以获得所有可能配对的fd

+0

因此,通过距离获取角度的情节,如果我理解正确的话,你希望的方式来计算255x255不同的可能性来计算距离/角度b在每个点之间(可能除了实际点本身)? – 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开始的第th个元素。你不能从一个int中减去一个列表,或者不管它是什么。

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

+0

你实际上并不需要任何明确的循环;因为我们正在处理'numpy'数组,操作可以是矢量化的。 – fuglede

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 

但是,也许甚至还有一个更简单的方法...

+0

它不起作用。它显示“TypeError:'int'对象不可迭代”。不知道这个... – larry

1

你可以考虑它作为阵列2的上外操作获得通过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.  ]]) 

这里,(Ĵ)个条目是之间的距离'和第Ĵ“个向量。

的角度之间的配对差异的情况是类似的,但更简单,因为你只需要一个维度处理:

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

啊!我做到了 !谢谢! – larry