2016-07-25 2 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 остается один вектор, и я могу передать список аргументов tiling

Так что я попытался определения нескольких разбиений с помощью генератора:

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

, а затем с помощью map и functools.partial:

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

По-видимому, есть проблема с x быть массивом или что-то, так как я получение ошибки:

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' 

Может кто-нибудь объяснить мне, как ge вокруг?

Кроме того, существует альтернативный и более быстрый способ сделать это (возможно, переписав функцию find_tile?)

ответ

1

Вы проходящее в x качестве именованного аргумента а. map() проходит в каждом элементе от tilings в качестве позиционный аргумент. Однако, поскольку ваш первый позиционный аргумент равен x, он сталкивается с аргументом ключевого слова. Использование имени в качестве аргумента ключевого слова не мешает тому, чтобы одно и то же имя заполнялось позиционным аргументом.

Не используйте аргумент ключевого слова для x; просто передать его в качестве позиционного аргумента partial():

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

Теперь каждый элемент из tilings передается в качестве второго аргумента и произведения вызова.

Смежные вопросы