Python使用map调用自定义函数时如何传入额外固定参数
错误原因
你使用的map方法(无论Python原生map还是multiprocessing/concurrent.futures等并发库的map实现)的传参逻辑是:除第一个函数参数外,后续所有传入的参数都必须是可迭代对象,执行时每次会从每个可迭代对象中各取1个元素,作为入参传给目标函数。
你直接传入了整数常量200,它不是可迭代对象,因此map只会把每个分片数据集传给calculate_frequent_itemset,导致第二个参数support缺失,触发报错。
修复方案
方案1:用functools.partial固定参数(最简洁)
提前把support参数固定为200,再把包装后的函数传给map:
from functools import partial # 固定support参数为200 fixed_calculate = partial(calculate_frequent_itemset, support=200) # 仅需传入数据集可迭代对象即可 frequent_itemsets = p.map(fixed_calculate, (dataNew1, dataNew2, dataNew3, dataNew4, dataNew5))
方案2:把support转为等长可迭代对象
用itertools.repeat生成和数据集数量一致的200可迭代序列,传入map:
from itertools import repeat # 生成包含5个200的可迭代对象,和数据集长度对应 frequent_itemsets = p.map(calculate_frequent_itemset, (dataNew1, dataNew2, dataNew3, dataNew4, dataNew5), repeat(200, 5))
注意:repeat的次数必须和数据集分片的数量一致,否则会按更短的可迭代对象长度截断,导致参数匹配错误。
方案3:用starmap传参(仅适用于支持starmap的并发库,比如multiprocessing.Pool)
把每个调用的参数打包成元组,用starmap自动解包传入:
# 打包每一组参数 param_list = [(d, 200) for d in (dataNew1, dataNew2, dataNew3, dataNew4, dataNew5)] # starmap会自动把每个元组的元素按位置传给函数 frequent_itemsets = p.starmap(calculate_frequent_itemset, param_list)
补充注意
如果你使用的是mlxtend库的apriori实现,它的min_support参数默认要求是0~1之间的比例值(代表支持度对应的样本占比),如果需要传入绝对样本数200,要先确认你用的apriori实现是否支持绝对数值作为参数,否则可能返回空的频繁项集结果。
内容的提问来源于stack exchange,提问作者vojta
相关产品推荐
相关产品推荐

