如何在Python中向map()函数传递*args?

问题描述 投票:-1回答:1

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

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():

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 接受不同 *args.

编辑2:新增 F 作为输入参数,用于 passfpassf 解释。

python-3.x args
1个回答
1
投票

由于函数F有两个两个(或更多)输入,你将不得不使用lambda来能够使用多个输入,然后在其上调用map。

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

你仍然必须使用list comprehension来将你的数组分解成1D数组,但是这个函数应该可以满足你多处理的主要目的。

© www.soinside.com 2019 - 2024. All rights reserved.