2013-02-18 66 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