You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:36:05