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

ループを実行するには、変数名にデータを含めないようにする必要があります。簡単な解決策は、代わりに辞書を使用することです。ループは、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 に答える
2

を見てくださいscipy.spatial.distance.cdist

ドキュメントから:

入力の 2 つのコレクションの各ペア間の距離を計算します。

したがって、次のようなことができます。

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)開始年が分かっていて、欠落している年がない場合は、距離行列の座標でどの 2 年が比較されているかを簡単に判断できます。

于 2013-02-18T01:47:10.600 に答える