在Python中通过循环数组找到欧几里得距离
这是我目前的进展:
Stats2003 = np.loadtxt('/DataFiles/2003.txt')
Stats2004 = np.loadtxt('/DataFiles/2004.txt')
Stats2005 = np.loadtxt('/DataFiles/2005.txt')
Stats2006 = np.loadtxt('/DataFiles/2006.txt')
Stats2007 = np.loadtxt('/DataFiles/2007.txt')
Stats2008 = np.loadtxt('/DataFiles/2008.txt')
Stats2009 = np.loadtxt('/DataFiles/2009.txt')
Stats2010 = np.loadtxt('/DataFiles/2010.txt')
Stats2011 = np.loadtxt('/DataFiles/2011.txt')
Stats2012 = np.loadtxt('/DataFiles/2012.txt')
Stats = Stats2003, Stats2004, Stats2004, Stats2005, Stats2006, Stats2007, Stats2008, Stats2009, Stats2010, Stats2011, Stats2012
我正在尝试计算这些数组之间的欧几里得距离,也就是每个数组和其他数组之间的距离,但我遇到了一些困难。
我想要的输出是通过计算距离得到的,像这样:
dist1 = np.linalg.norm(Stats2003-Stats2004)
dist2 = np.linalg.norm(Stats2003-Stats2005)
dist11 = np.linalg.norm(Stats2004-Stats2005)
等等,但我希望能用一个循环来进行这些计算。
我正在使用Prettytable把计算结果显示成一个表格。
有没有人能给我一些建议?我没有找到任何之前有效的解决方案。
2 个回答
2
要进行循环,你需要避免在变量名中使用数据。一个简单的解决办法是使用字典。循环在字典推导式中是隐含的:
import itertools as it
years = range(2003, 2013)
stats = {y: np.loadtxt('/DataFiles/{}.txt'.format(y) for y in years}
dists = {(y1,y2): np.linalg.norm(stats[y1] - stats[y2]) for (y1, y2) in it.combinations(years, 2)}
现在可以通过 stats[2007]
来访问特定年份的统计数据,比如2007年,使用元组来获取距离,例如 dists[(2007, 20011)]
。
2
看看这个链接:scipy.spatial.distance.cdist
。
根据文档的说明:
这个功能可以计算两个输入集合中每一对之间的距离。
所以你可以做类似下面的事情:
import numpy as np
from scipy.spatial.distance import cdist
# start year to stop year
years = range(2003,2013)
# this will yield an n_years X n_features array
features = np.array([np.loadtxt('/Datafiles/%s.txt' % year) for year in years])
# compute the euclidean distance from each year to every other year
distance_matrix = cdist(features,features,metric = 'euclidean')
如果你知道起始年份,并且每年的数据都没有缺失,那么就很容易确定在距离矩阵中坐标 (m,n)
比较的是哪两年。