numpy实现不同形状2D数组笛卡尔乘积后逐行横向拼接的规范方法
解决方案
有非常简洁的纯NumPy原生实现,不需要依赖itertools,可读性和性能都远优于混合Python循环的方案。
核心思路:我们需要实现两个2D数组行维度的笛卡尔乘积再按行拼接,只需对两个数组的行做对应重复/平铺,使得处理后两个数组行数一致,再横向拼接即可。
代码实现(完全匹配你的示例需求)
import numpy as np # 你的输入数组 ident2 = np.identity(2) ident3 = np.identity(3) # 获取数组形状参数 row_a, col_a = ident3.shape row_b, col_b = ident2.shape # 方法1:repeat + tile实现,可读性极高 # ident3每行重复row_b次,对应ident2的每一行 a_repeat = np.repeat(ident3, repeats=row_b, axis=0) # ident2整体重复row_a次,对应ident3的每一行 b_tile = np.tile(ident2, reps=(row_a, 1)) # 横向拼接得到结果 result = np.hstack([a_repeat, b_tile]) # 如需输出整数类型,增加类型转换即可 # result = result.astype(int) print(result)
输出结果:
[[1. 0. 0. 1. 0.] [1. 0. 0. 0. 1.] [0. 1. 0. 1. 0.] [0. 1. 0. 0. 1.] [0. 0. 1. 1. 0.] [0. 0. 1. 0. 1.]]
大数组优化版(更高内存效率)
如果处理大规模数组,可以用广播机制避免冗余内存复制,性能更高:
# 方法2:广播实现,全程无额外内存复制 a_broad = np.broadcast_to(ident3[:, None, :], (row_a, row_b, col_a)).reshape(-1, col_a) b_broad = np.broadcast_to(ident2[None, :, :], (row_a, row_b, col_b)).reshape(-1, col_b) result = np.hstack([a_broad, b_broad])
如果你需要调整拼接顺序(把ident2放在前、ident3放在后),只需交换两个数组在hstack中的顺序,同时调整repeat和tile的对应参数即可。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

