Python 如何将 *args 传递给 map() 函数
How to pass *args to map() function in Python
例如,玩具数学函数:
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
接受二维 numpy 数组和位置参数 (*args),数组的每个元素(一维数组)将由 F
计算并输出一个标量。因此在这种情况下 [0,1,2]
作为输入将 return 5
、[10,2,0]
returns 100
和 [0,0,0]
returns -100
。所以我希望通过使用 map()
如上所述而不是列表操作来完成此操作。
对于 passf
,它接受一个函数 F
,所以我有许多不同的 F
将被传递给 passf
,其中每个 F
接受不同的 *args
.
编辑 2:添加 F
作为 passf
和 passf
解释的输入参数。
由于函数 F 有两个两个(或更多)输入,您必须使用 lambda 才能使用多个输入,然后在其上调用 map。
def passf_2(x, *args):
return list(map(lambda x_: F(x_, *args), [x_ for x_ in x]))
您仍然需要使用列表推导式将数组分解为一维数组,但此函数应该符合您的多处理主要目标。
例如,玩具数学函数:
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
接受二维 numpy 数组和位置参数 (*args),数组的每个元素(一维数组)将由 F
计算并输出一个标量。因此在这种情况下 [0,1,2]
作为输入将 return 5
、[10,2,0]
returns 100
和 [0,0,0]
returns -100
。所以我希望通过使用 map()
如上所述而不是列表操作来完成此操作。
对于 passf
,它接受一个函数 F
,所以我有许多不同的 F
将被传递给 passf
,其中每个 F
接受不同的 *args
.
编辑 2:添加 F
作为 passf
和 passf
解释的输入参数。
由于函数 F 有两个两个(或更多)输入,您必须使用 lambda 才能使用多个输入,然后在其上调用 map。
def passf_2(x, *args):
return list(map(lambda x_: F(x_, *args), [x_ for x_ in x]))
您仍然需要使用列表推导式将数组分解为一维数组,但此函数应该符合您的多处理主要目标。