2013-02-18 37 views
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将计算显示到表格中。

任何人都可以指向正确的方向吗?我还没有找到任何以前的解决方案。

+0

决赛桌是什么样的? – tdihp 2013-02-18 01:38:52

+0

表格每年都有列标题(2003,2004,等 - 2012)和行标题(2003,2004等 - 2012)。然后每个元组显示给定年份和其他年份之间的欧几里得距离。 http://cl.ly/image/07120Z171z1z – Cetus 2013-02-18 01:43:17

回答

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)处比较距离矩阵。

+0

谢谢。我会给这个镜头。 – Cetus 2013-02-18 02:28:40

2

要做循环,你需要keep data out of your variable names。一个简单的解决方案是使用字典来代替。该循环在字典内涵是含蓄:

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

+0

我在规范中犯了一个错字,现在修好了。 – wim 2013-02-18 02:59:43

+0

谢谢wim我欣赏它! – Cetus 2013-02-18 03:07:08