Python函数传参时解包数组列表并同步截取元素的方法
实现方案
问题背景
执行以下numpy代码:
import numpy as np x = np.random.rand(100, 2) rv_values, bins_values = np.histogramdd(x, bins=100, density=True) meshed_coordinates = np.meshgrid(*bins_values)
返回的meshed_coordinates是包含2个维度为(101,101)数组的列表,结果符合预期:给np.histogramdd传入bins=100参数后,返回的bins_values列表包含2个长度为101的一维数组。
需要实现的需求为:调用np.meshgrid时,直接传入对bins_values中每个数组做[:-1]截取后的结果,不需要在函数调用外逐个手动截取数组,也不需要额外编写for循环遍历列表,同时要支持任意长度的bins_values列表。
具体写法
直接在解包传参时使用生成器表达式完成切片即可,不需要提前单独处理列表,代码如下:
meshed_coordinates = np.meshgrid(*(arr[:-1] for arr in bins_values))
- 写法核心是用生成器表达式
(arr[:-1] for arr in bins_values),解包时会自动遍历bins_values中的每一个数组,逐个完成[:-1]截取操作 - 该写法对
bins_values的长度没有限制,不管是2维、3维还是更高维度的直方图分箱结果,都可以自动适配 - 不需要额外定义临时存储列表,也不需要在函数调用外写显式for循环,代码简洁,没有多余的内存开销
扩展提示:如果后续需要对每个分箱数组做其他统一处理,比如取分箱区间中点、加固定偏移等,只需要修改生成器表达式内的运算逻辑即可。例如要取每个分箱的中点生成网格,可以直接写为:
meshed_coordinates = np.meshgrid(*( (arr[:-1] + arr[1:])/2 for arr in bins_values ))
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

