我是Python新手,所以这个问题可能看起来很琐碎。但是,我没有发现类似的病例。我有20个节点的坐标矩阵。我想计算这个集合中所有节点对之间的欧几里德距离,并将它们存储在成对矩阵中。例如,如果我有20个节点,我希望最终结果是(20,20)的矩阵,每个节点对之间的欧氏距离值。我尝试使用for循环遍历坐标集的每个元素,并计算欧几里德距离,如下所示:
ncoord=numpy.matrix('3225 318;2387 989;1228 2335;57 1569;2288 8138;3514 2350;7936 314;9888 4683;6901 1834;7515 8231;709 3701;1321 8881;2290 2350;5687 5034;760 9868;2378 7521;9025 5385;4819 5943;2917 9418;3928 9770')
n=20
c=numpy.zeros((n,n))
for i in range(0,n):
for j in range(i+1,n):
c[i][j]=math.sqrt((ncoord[i][0]-ncoord[j][0])**2+(ncoord[i][1]-ncoord[j][1])**2)
怎么会,我得到一个错误“输入必须是一个正方形数组 ". 我想知道是否有人知道这里发生了什么事。 谢谢
我想你想做的是:你说你想要一个20乘20的矩阵。。。但是你编码的是三角形的。
因此我编码了一个完整的20x20矩阵。
弯道:
注意:
ncoord[i, j]
与ncoord[i][j]
对于Numpy矩阵不同。这似乎是混乱的根源。如果ncoord
是一个Numpy数组,那么它们将给出相同的结果。对于Numpymatrix,
ncoord[i]
返回ncoord
的第行的,它本身是一个Numpymatrix对象,在您的例子中是1 x 2形状。因此,ncoord[i][j]
实际上是指:取ncoord
的第i行和取1×2矩阵的第j行。这就是索引问题在j
>;0时出现的地方。关于您对分配给
c[i][j]
“工作”的评论,应该不会。至少在我的Numpy 1.9.1版本中,如果您的索引i
和j
迭代到n
时,应该不会工作。作为旁白,请记住将矩阵
c
的转置相加。建议使用Numpy数组而不是矩阵。见this post。
如果坐标存储为Numpy数组,则成对距离可以计算为:
或者只是
因为默认度量是“euclidean”,而默认度量“p”是2。
在下面的评论中,我错误地提到pdist的结果是n x n矩阵。 要得到n x n矩阵,需要执行以下操作:
或者
使用嵌套的
for
循环进行此操作的替代方法要快得多。我将向您展示两种不同的方法-第一种方法将是更通用的方法,它将向您介绍广播和矢量化,第二种方法使用更方便的scipy库函数。一。一般方法,使用广播和矢量化
我建议首先使用
np.array
,而不是np.matrix
。数组是a number of reasons的首选,最重要的是因为它们可以具有>;2维,而且它们使按元素进行乘法变得不那么困难。使用数组,我们可以通过插入一个新的单例维度和broadcasting上的减法来消除嵌套的
for
循环:这相当于使用嵌套for循环在每对行上循环,但要快得多!
剩下的我们也可以使用矢量化操作:
整件事可以这样一字排开:
2。懒惰的方式,使用
pdist
原来已经有了一个快速方便的函数来计算所有的成对距离:^{} 。
相关问题 更多 >
编程相关推荐