python-3.x - 如何在 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
为输入参数passf
和passf
解释。
解决方案
由于函数 F 有两个(或更多)输入,因此您必须使用 lambda 才能使用多个输入,然后在其上调用 map。
def passf_2(x, *args):
return list(map(lambda x_: F(x_, *args), [x_ for x_ in x]))
您仍然必须使用列表推导将数组分解为一维数组,但此功能应该适用于您的多处理主要目标。
推荐阅读
- android - 不会更改我的按钮的 kivy 文件
- grafana - 当 Grafana 在 DC/OS 上重新启动时,仪表板和可视化会丢失
- nested - latex - 使用嵌套值传递参数
- python - 在当前目录安装python包
- html - 使图像在悬停时从中心展开并使图像仍留在框中
- angular - 如何以角度 4 反应形式创建动态数组并将每个字段与输入(formControlName)绑定?
- vba - 如何在保持格式的同时连接多个 rtf 文件
- c++ - 在 C++ 中比较来自向量的字符串时出现分段错误
- haskell - Haskell 按列表索引过滤
- mysql - 删除 # OR 第一行数据允许我将它输入到数据库中吗?