如何在Python中将* args传递给map()函数

时间:2020-05-05 09:04:50

标签: python-3.x args

例如,玩具数学函数:

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作为Fpassf解释的输入参数。

1 个答案:

答案 0 :(得分:1)

由于函数F具有两个两个(或更多个)输入,因此必须使用lambda才能使用多个输入,然后在该函数上调用map。

def passf_2(x, *args):
    return list(map(lambda x_: F(x_, *args), [x_ for x_ in x]))

您仍然必须使用列表推导将数组分解为一维数组,但是此功能应该可以实现多处理的主要目的。