具有固定数组值参数

时间:2016-07-25 16:01:05

标签: python function vectorization

我试图通过参数tiling

对以下函数进行矢量化
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))

然后使用mapfunctools.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'

有人可以向我解释如何绕过它吗?

另外,是否有另一种更快的方法(可能重写函数find_tile?)

1 个答案:

答案 0 :(得分:1)

您正在传递x作为关键字参数map()将来自tilings的每个元素作为位置参数传递。但是,由于您的第一个位置参数是x,因此与关键字参数冲突。使用名称作为关键字参数不会阻止使用位置参数填充相同的名称。

不要为x使用关键字参数;只需将其作为位置参数传递给partial()

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

现在,tilings中的每个元素都作为第二个位置参数传入,并且调用有效。