如何用Numpy实现双数组二维迭代以替代列表推导式?
使用Numpy实现笛卡尔积式二维迭代
可以利用Numpy的repeat和tile函数实现完全向量化的操作,彻底避免列表推导式,直接生成目标二维数组,具体步骤如下:
- 拆分x、y数组中的独立分量
- 对x分量进行重复,匹配y的元素数量
- 对y分量进行平铺,循环匹配每个x
- 拼接所有分量得到最终结果
具体代码实现:
import numpy as np x_cam_screen_range = np.linspace((6, 0), (18, 1), 3) y_cam_screen_range = np.linspace((-3, 0), (3, 1), 3) # 拆分x相关的两个分量 x_vals = x_cam_screen_range[:, 0] screen_x_vals = x_cam_screen_range[:, 1] # 拆分y相关的两个分量 y_vals = y_cam_screen_range[:, 0] screen_y_vals = y_cam_screen_range[:, 1] # 对x分量重复,每个x对应所有y x_repeated = np.repeat(x_vals, len(y_vals)) screen_x_repeated = np.repeat(screen_x_vals, len(y_vals)) # 对y分量平铺,循环匹配每个x y_tiled = np.tile(y_vals, len(x_vals)) screen_y_tiled = np.tile(screen_y_vals, len(x_vals)) # 拼接成最终的二维数组 tile_iter_np = np.column_stack([x_repeated, screen_x_repeated, y_tiled, screen_y_tiled]) print(tile_iter_np)
运行结果与列表推导式生成的内容完全一致,输出为:
[[ 6. 0. -3. 0. ] [ 6. 0. 0. 0.5] [ 6. 0. 3. 1. ] [12. 0.5 -3. 0. ] [12. 0.5 0. 0.5] [12. 0.5 3. 1. ] [18. 1. -3. 0. ] [18. 1. 0. 0.5] [18. 1. 3. 1. ]]
这种方法基于Numpy的向量化操作,处理大规模数据时效率远高于列表推导式,完全符合Numpy的使用规范。
内容的提问来源于stack exchange,提问作者Spencer M.
相关产品推荐
相关产品推荐

