3

这是我迄今为止所拥有的:

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 将计算结果显示到表格中。

谁能指出我正确的方向?我还没有找到任何以前有效的解决方案。

4

2 回答 2

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)如果您知道开始年份,并且您没有丢失任何年份的数据,那么很容易确定在距离矩阵中的坐标处比较了哪两年。

于 2013-02-18T01:47:10.600 回答
2

要执行循环,您需要将数据保留在变量名之外。一个简单的解决方案是改用字典。这些循环隐含在 dict 理解中:

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)}

现在访问特定年份的统计信息,例如 2007 年,通过stats[2007]元组和距离,例如dists[(2007, 20011)].

于 2013-02-18T01:49:41.580 回答