2017-11-07 10 views
0

numpy 및 해당 벡터화를 사용하여 KNN 알고리즘을 구현하려고합니다.중첩 된 행렬을 벡터화하는 numpy knn

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

KNN 알고리즘을 순수 파이썬으로 작성할 수 있습니다. 그런 다음이를 쉰 코드로 다시 작성하는 방법을 묻습니다. 나는 더 잘 생각한다. –

답변

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