Python 如何避免由double';对于循环';当计算向量之间的距离时
给定以下代码,该代码计算列表“vect”中向量之间的距离:Python 如何避免由double';对于循环';当计算向量之间的距离时,python,numpy,complexity-theory,distance,quadratic,Python,Numpy,Complexity Theory,Distance,Quadratic,给定以下代码,该代码计算列表“vect”中向量之间的距离: import numpy as np vect=([0.123, 0.345, 0.789], [0.234, 0.456, 0.567],[0.134, 0.246, 0.831]) def kn(): for j in vect: c=np.array(j) for z in vect: p=np.array(z) space = np.lina
import numpy as np
vect=([0.123, 0.345, 0.789], [0.234, 0.456, 0.567],[0.134, 0.246, 0.831])
def kn():
for j in vect:
c=np.array(j)
for z in vect:
p=np.array(z)
space = np.linalg.norm(c-p)
print space
kn()
有没有办法避免双重“for循环”导致的二次复杂性
双for循环(二次型)==3X3=9的计算结果
提前感谢您的建议。为避免重复对,嵌套循环应从外部循环的索引向上,即:
for i, v1 in enumerate(vect):
for j in xrange(i + 1, len(vect)):
a = np.array(v1)
b = np.array(vect[j])
space = np.linalg.norm(b - a)
print space
或者使用标准库提供的解决方案:
import itertools
for v1, v2 in itertools.combinations(vect, 2):
a = np.array(v1)
b = np.array(v2)
space = np.linalg.norm(b - a)
print space
为避免重复对,嵌套循环应从外部循环的索引向上移动,即:
for i, v1 in enumerate(vect):
for j in xrange(i + 1, len(vect)):
a = np.array(v1)
b = np.array(vect[j])
space = np.linalg.norm(b - a)
print space
或者使用标准库提供的解决方案:
import itertools
for v1, v2 in itertools.combinations(vect, 2):
a = np.array(v1)
b = np.array(v2)
space = np.linalg.norm(b - a)
print space
其他人注意到,您无法避免二次复杂性。但是如果您关心的是性能,那么可以通过使用大大加快速度,这将使所有循环和函数调用都在C语言中进行,而不是在Python中进行。下面的代码返回一个正方形对称数组,但它只进行
n*(n-1)/2
计算:
from scipy.spatial.distance import pdist
pairwise_distances = pdist(vect, metric='euclidean', p=2)
如果需要仅具有唯一非对角值的展平阵列,可以使用:
在您的情况下,
成对距离将是一个3元素长的数组。其他人注意到,您无法避免二次复杂度。但是如果您关心的是性能,那么可以通过使用大大加快速度,这将使所有循环和函数调用都在C语言中进行,而不是在Python中进行。下面的代码返回一个正方形对称数组,但它只进行n*(n-1)/2
计算:
from scipy.spatial.distance import pdist
pairwise_distances = pdist(vect, metric='euclidean', p=2)
如果需要仅具有唯一非对角值的展平阵列,可以使用:
在你的例子中,成对距离
将是一个3元素长的数组。。你的解决方案发挥了神奇的作用。多谢了,大哥。你的解决方案发挥了神奇的作用。非常感谢。感谢您提供的解决方案和信息,它们都很有效。我更喜欢只导入pdist的那个。谢谢。谢谢你提供的解决方案和信息,它们都很有效。我更喜欢只导入pdist的那个。谢谢