2016-12-12 5 views
0
from numpy import genfromtxt, linalg, array, append, hstack, vstack 

#Euclidean distance function 
def euclidean(v1, v2): 
    dist = linalg.norm(v1 - v2) 
    return dist 

#get the .csv files and eliminate heading and unused columns from test 
BMUs = genfromtxt('BMU3.csv', delimiter=',') 
data = genfromtxt('test.csv', delimiter=',') 
data = data[1:, :-2] 

i = 0 
for obj in data: 
    D = 0 
    for BMU in BMUs: 
     Dist = append(euclidean(obj, BMU[: -2]), BMU[-2:]) 
    D = hstack(Dist) 

Map = vstack(D) 

#iteration counter 
i += 1 
if not i % 1000: 
    print (i, ' of ', len(data)) 

print (Map) 

を反復マトリックス構築物である:[-2]Pythonは私がしたいどのようなアレイ

  1. はBMU(ユークリッド(OBJ、BMUからデータ
  2. 計算距離からオブジェクトを取ります距離)
  3. 追加BMUアレイ
  4. の最後の2つの項目がデータ・オブジェクト(D = hstack(ディスト)からすべての距離に加えて、すべてのBMUの最後の2つの項目を含む2D行列を作成する)
  5. は、データ内のオブジェクトの数と等しい長さの行列の配列を作成します。 (地図= vstack(D))

ここでの問題、または少なくとも私が問題だと思うのは、hstackとvstackは配列のタプルを1つの配列ではなく入力することです。 List.append()をリストとして使うのと同じように、悲しいことに私は初心者ですし、それをどうやってやるのか分かりません。

すべてのヘルプは素晴らしいだろう、事前にあなたに感謝:)

答えて

0

をまず使用上の注意:

の代わりに:

from numpy import genfromtxt, linalg, array, append, hstack, vstack 

使用第二

import numpy as np 
.... 
data = np.genfromtxt(....) 
.... 
    np.hstack... 

、滞在離れてnp.appendから離れてください。それはあまりにも使い易い。 np.concatenateを使って、それが何をしているのかの完全な味を得ることができます。

append

リストは、サンプルアレイ(又は少なくとも形状)なし==================

alist = [] 
for .... 
    alist.append(....) 
arr = np.array(alist) 

増分作業のために良好であるI私は推測している。しかし、(n、2)配列は合理的に聞こえる。

In [121]: data = np.arange(6).reshape(3,2) 
In [122]: [[euclidean(d,b) for b in data] for d in data] 
Out[122]: 
[[0.0, 2.8284271247461903, 5.6568542494923806], 
[2.8284271247461903, 0.0, 2.8284271247461903], 
[5.6568542494923806, 2.8284271247461903, 0.0]] 

および配列ことを確認:お互いから「点」の各対の距離を取って、私は、ネストされたリスト内包の値を収集することができ、ネストされたループを有する

In [123]: np.array([[euclidean(d,b) for b in data] for d in data]) 
Out[123]: 
array([[ 0.  , 2.82842712, 5.65685425], 
     [ 2.82842712, 0.  , 2.82842712], 
     [ 5.65685425, 2.82842712, 0.  ]]) 

等価:

alist = [] 
for d in data: 
    sublist=[] 
    for b in data: 
     sublist.append(euclidean(d,b)) 
    alist.append(sublist) 
arr = np.array(alist) 

ループなしでこれを行う方法はありますが、基本的なPythonループアプローチが最初に機能することを確認しましょう。

===============

私はdata内のすべての要素(行)と、ここでbmu(または内のすべての要素の間(​​最後の軸に沿って)差をつけたい場合data)、私は配列放送を使うことができます。

In [130]: data[None,:,:]-data[:,None,:] 
Out[130]: 
array([[[ 0, 0], 
     [ 2, 2], 
     [ 4, 4]], 

     [[-2, -2], 
     [ 0, 0], 
     [ 2, 2]], 

     [[-4, -4], 
     [-2, -2], 
     [ 0, 0]]]) 

normが大きい次元配列を扱うことができるとaxisパラメータを取る:結果は(3,3,2)アレイです。

In [132]: np.linalg.norm(data[None,:,:]-data[:,None,:],axis=-1) 
Out[132]: 
array([[ 0.  , 2.82842712, 5.65685425], 
     [ 2.82842712, 0.  , 2.82842712], 
     [ 5.65685425, 2.82842712, 0.  ]]) 
+0

は、どうもありがとうございました、あなたのアドバイスをお待ちしております:) –

+0

'shape'(と' dtype'は)何 'BMU'と' data'のために?これは、複製したサンプルを使用してコードをテストする方が簡単です。そうしないと私は推測して( 'データ= np.arange(24).reshape(12,2)'のような)サンプルアレイを構成する必要があります。 – hpaulj

+0

(243 7)BMUs.shape (19219、5)data.shape –

0

あなたの助けのおかげで、私は最終的なプログラムここでは、擬似コードを実装するために管理:

import numpy as np 


def euclidean(v1, v2): 
    dist = np.linalg.norm(v1 - v2) 
    return dist 


def makeKNN(dataSet, BMUSet, k, fileOut, test=False): 
    # take input files 
    BMUs = np.genfromtxt(BMUSet, delimiter=',') 
    data = np.genfromtxt(dataSet, delimiter=',') 

    final = data[1:, :] 
    if test == False: 
     data = data[1:, :] 
    else: 
     data = data[1:, :-2] 

# Calculate all the distances between data and BMUs than reorder BMU with the distances information 

    dist = np.array([[euclidean(d, b[:-2]) for b in BMUs] for d in data]) 
    BMU_K = np.array([BMUs[np.argsort(d)] for d in dist]) 

    # median over the closest k BMU 
    Z = np.array([[np.sum(b[:k].T[5])/k] for b in BMU_K]) 

    # error propagation 
    Z_err = np.array([[np.sqrt(np.sum(np.power(b[:k].T[5], 2)))] for b in BMU_K]) 

    # Adding z estimates and errors to the data 
    final = np.concatenate((final, Z, Z_err), axis=1) 

    # print output file 
    np.savetxt(fileOut, final, delimiter=',') 
    print('So long, and thanks for all the fish') 

はどうもありがとうございました、私は、このコードは、将来的に他の誰かを助けることを願っています:)

関連する問題