我试图通过参数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))
然后使用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'
有人可以向我解释如何绕过它吗?
另外,是否有另一种更快的方法(可能重写函数find_tile
?)
答案 0 :(得分:1)
您正在传递x
作为关键字参数。 map()
将来自tilings
的每个元素作为位置参数传递。但是,由于您的第一个位置参数是x
,因此与关键字参数冲突。使用名称作为关键字参数不会阻止使用位置参数填充相同的名称。
不要为x
使用关键字参数;只需将其作为位置参数传递给partial()
:
map(functools.partial(find_tile, x), tilings)
现在,tilings
中的每个元素都作为第二个位置参数传入,并且调用有效。