2017-11-07 6 views
0

私はnumpyとベクトル化を使ってKNNアルゴリズムを実装しようとしています。numpy knested withベクトル化入れ子の行列

import numpy as np 

A = np.array([[11,12,13], [21,22,23], [31,32,33]]) 
B = np.array([[41,42,43], [51,52,53], [61,62,63]]) 
C = np.array([[71,72,73], [81,82,83], [91,92,93]]) 

X = np.array([A, B, C]) 

f = lambda a,b: (a-b)**2 
np.sqrt(np.vectorize(f)(A, X).reshape(3,9).sum(axis=1)) 
# array([ 0., 90., 180.]) 

私はそれをこのように使用している場合は、私はお互いにすべてのベクトルのすべての距離を取得するにはA.

にすべてのベクトルの距離の3×1行列を取得し、私はその結果の行列が必要になります次のようになります。

array([[ 0., 90., 180.], 
     [ 90., 0., 90.], 
     [ 180., 90., 0.]]) 

希望の結果が得られるように操作を改善するにはどうすればよいですか?

+1

'np.vectorize'を使用する際のポイントは何ですか?あなたはそれを除いて配列の減算とパワーを行うことができるはずです。この関数は、スカラーの形でしか表現できない複雑な関数を対象としています。 – hpaulj

+0

あなたは純粋なpythonでKNNアルゴリズムを書くことができます。それからnumpyのコードに書き換える方法を尋ねる。どちらが良いと思いますか? –

答えて

0
In [843]: np.sqrt(f(X[:,None],X).reshape(3,3,9).sum(axis=-1)) 
Out[843]: 
array([[ 0., 90., 180.], 
     [ 90., 0., 90.], 
     [ 180., 90., 0.]]) 

vectorizeは必要ありません。 fは配列を直接使用します。

しかし

In [841]: f(X[:,None],X).reshape(3,3,9) 
Out[841]: 
array([[[ 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 900, 900, 900, 900, 900, 900, 900, 900, 900], 
     [3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600]], 

     [[ 900, 900, 900, 900, 900, 900, 900, 900, 900], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 900, 900, 900, 900, 900, 900, 900, 900, 900]], 

     [[3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600], 
     [ 900, 900, 900, 900, 900, 900, 900, 900, 900], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0]]], dtype=int32) 

を見て、私はあなたが必要以上の値を計算している疑いがあることができます。しかし、私は大きな絵を見ようとしていません。

+0

ありがとうございました! Numpyの索引付けは、時には理解が難しい場合もあります。あなたは計算の複雑さについても正しいです。 – sebsch

関連する問題