我在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]
并再次进行计算,以获得所有可能对的f
和d
吗?
答案 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)
如果您对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
但也许有更简单的方法......