首页 > 解决方案 > 如何在 Python 中将 *args 传递给 map() 函数

问题描述

例如,一个玩具数学函数:

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来并行评估值。那么是否可以将 map*args用作输入参数?

编辑:所以这是工作的主要部分,通过使用列表操作而不是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的 s 将被传递给passf,每个F接受不同的*args

编辑2:添加F为输入参数passfpassf解释。

标签: python-3.xargs

解决方案


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

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

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


推荐阅读