例如,玩具数学函数:
def F(x,*args):
val=0
for x_ in x:
val += x_**2
if val<=args[0]:
val= -100
elif val>args[1]:
val= 100
return val
我想在另一个使用map的函数中调用它以求值列表:
import numpy as np
if __name__ == "__main__":
def passf(F, x, *args):
#do some operations......
return map(F, x, *args)
x = np.array([[0,1,2],[10,2,0],[0,0,0]])
print(list(passf(F, x, 1,100)))
它给出了错误TypeError: 'int' object is not iterable
。如果将return map(F, x, *args)
更改为列出操作return [F(x_, *args) for x_ in x]
,它将起作用。但是我想使用map()
,因为稍后我计划使用multiprocessing pool map
来并行评估值。那么可以使用以*args
作为输入参数的map吗?
编辑:因此,这是工作的主要部分,通过使用列表操作而不是map()
:
import numpy as np
if __name__ == "__main__":
def passf(F, x, *args):
#do some operations......
return [F(x_, *args) for x_ in x]
x = np.array([[0,1,2],[10,2,0],[0,0,0]])
print(list(passf(F, x, 1,100)))
这将输出:
[5, 100, -100]
基本上F
接受2D numpy数组和位置参数(* args),该数组的每个元素(即1D数组)将由F
求值并输出标量。因此,在这种情况下,[0,1,2]
作为输入将返回5
,[10,2,0]
返回100
,而[0,0,0]
返回-100
。因此,我希望通过使用如上所述的map()
而不是列表操作来完成此操作。
对于passf
,它接受一个函数F
,所以我有许多不同的F
将被传递到passf
,其中每个F
都接受不同的{{ 1}}。
编辑2 :添加了*args
作为F
和passf
解释的输入参数。
答案 0 :(得分:1)
由于函数F具有两个两个(或更多个)输入,因此必须使用lambda才能使用多个输入,然后在该函数上调用map。
def passf_2(x, *args):
return list(map(lambda x_: F(x_, *args), [x_ for x_ in x]))
您仍然必须使用列表推导将数组分解为一维数组,但是此功能应该可以实现多处理的主要目的。