2014-09-18 4 views
1

결과가 P [i, j] = f (v [i], v [ j]). 나는 단순히 그것을 할 수 있다는 사실을 알고 :두 개의 벡터에 대한 함수를 브로드 캐스팅하여 두 번째 numpy 배열을 얻는다.

P = zeros((v.shape[0], v.shape[0])) 
for i in range(P.shape[0]): 
    for j in range(P.shape[0]): 
     P[i, j] = f(v[i,:], v[j,:]) 

이상 해키 :

from scipy.spatial.distance import cdist 
P = cdist(v, v, metric=f) 

하지만 내가 할 수있는 가장 빠르고 산뜻한 방법을 찾고 있어요. 이것은 numpy가 내장해야하는 방송 기능처럼 보입니다. 제안 사항이 있으십니까?

+0

작동하는 경우,'cdist'는이를 수행하는 꽤 깨끗한 방법처럼 보입니다. 호출 가능한'metric'의 경우,'cdist'는 코드가하는 일을 정확하게 수행합니다. – hpaulj

+0

그래서'f (a, b)'는 2 개의 1 차원 배열을 취하고 스칼라를 반환합니까? – hpaulj

+0

'f1 = functools.partial (cdist, metric = f)'는'cdist' 사용법을 숨 깁니다. – hpaulj

답변

1

내가 검색 한 내용은 numpy.vectorize입니다. 다음과 같이 사용하십시오 :

def f(x, y): 
    return x + y 
v = numpy.array([1,2,3]) 
# vectorize the function 
vf = numpy.vectorize(f) 
# "transposing" the vector by producing a view with another shape 
vt = v.reshape((v.shape[0], 1) 
# calculate over all combinations using broadcast 
vf(v, vt) 

Output: 
array([[ 2., 3., 4.], 
     [ 3., 4., 5.], 
     [ 4., 5., 6.]]) 
+1

'vectorize'는 속도를 높이 지 못합니다. 방송 기계를 이용할 수있게하면서 루프를 감쌀뿐입니다. – hpaulj

+0

아마 내가 틀렸지 만 그가 원하는 것을 정확히 믿을 수 있습니다. 빠른 numpy 레벨 루프는 방송을 통해 메모리 효율적인 반면. – itai

+0

그러나 샘플 코드에서 방송이 어디에서 사용되는지는 알 수 없습니다. – hpaulj