2016-07-25 3 views
0

내가 인수 tiling에 비해 다음과 같은 기능을 벡터화하기 위해 노력하고있어 평가 :파이썬 functools.partial 인수

def find_tile(x,tiling): 
    """ 
    Calculates the index of the closest element of 'tiling' to 'x'. 
    tiling: array of grid positions 
    x: variable of the same type as the elements of tiling 
    """ 
    return np.argmin(np.linalg.norm(tiling - x, axis=1)) 

예를 들어, 함수의 비 벡터화 버전은 다음 인수를 받아 들일 수를

tiling = np.array([[i,j] for i in xrange(3) for j in xrange(3)]) 
x = np.array([1.2, 2.7]) 

나는 x이 하나의 벡터로 남아 내가 인수 목록을 전달할 수 있도록, 가장 빠른 vectorisation을 찾는 데 관심 tiling

0 난 이후, 분명히

map(functools.partial(find_tile, x=x), tilings) 

, x가 배열 또는 뭔가되는 문제가있다 : mapfunctools.partial를 사용하여 다음

tilings = (tiling + np.random.uniform(0,1,2) for j in xrange(3)) 

과 :

그래서 나는 발전기를 사용하여 여러 타일링을 정의하는 시도 오류가 발생하는 경우 :

Traceback (most recent call last): 
    File "main.py", line 43, in <module> 
    inds = map(functools.partial(find_tile, x=x), ts) 
TypeError: find_tile() got multiple values for keyword argument 'x' 

누군가가 나를 어떻게 설명 할 수 있습니까? 그 주위에?

또한, 다른 빠른 방법이하는 것입니다이 (아마도 다시 쓰기 기능 find_tile?)

답변

1

당신은 키워드 인수x 전달됩니다. map()tilings에서 각 요소를 위치 인수으로 전달합니다. 그러나 첫 번째 위치 인수가 x이므로 키워드 인수와 충돌합니다. 이름을 키워드 인수로 사용한다고해서 동일한 이름이 위치 인수로 채워지는 것을 방지하지는 않습니다.

x에 대한 키워드 인수를 사용하지 마십시오. 단지 partial()에 위치 인수로에서 통과 : 이제 tilings에서 각 요소가 제 2 위치 인수와 통화 작품으로 전달되는

map(functools.partial(find_tile, x), tilings) 

.