跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

生成指定长度的0-1二元组合数组:每行前x位与后x位互补

本文介绍如何使用numpy与itertools高效生成长度为2x的二元数组,其中每行由x位二进制序列及其按位取反构成,确保所有2^x种前半段组合均被覆盖且整体行唯一。 要构造一个形状为 (2^x, 2x) 的 NumPy 数组,使得每一行均由一个长度为 x 的 0-1 序列与其逻辑补(即 1 - sequence)拼接而成,最简洁、高效的方式是利用 itertools.product 生成所有可能的 x 位二进制组合,再通过向量化操作自动生成对应的互补后半段。 具体实现如下:
import numpy as np from itertools import product def generate_complementary_binary_array(x): # 生成所有 x 位二进制组合:共 2^x 种,每行为长度 x 的 list base = np.array(list(product([0, 1], repeat=x))) # 拼接 base 与它的按位补(1 - base),得到 (2^x, 2x) 数组 result = np.column_stack([base, 1 - base]) return result # 示例:x = 2 print("x = 2:") print(generate_complementary_binary_array(2)) # 输出: # [[0 0 1 1] # [0 1 1 0] # [1 0 0 1] # [1 1 0 0]] # 示例:x = 3 print("\nx = 3:") print(generate_complementary_binary_array(3)) # 输出 8 行 × 6 列数组,每行形如 [a,b,c,1-a,1-b,1-c]
⚠️ 注意事项: jQuery缩略图网格排列大图切换代码 jQuery缩略图网格排列大图切换代码是一款将所有缩略图以网格形式排列,当用户点击某张缩略图时,会以九宫格切片组合动画的方式组合出高清大图,效果非常棒。 下载 此方法生成的是 字典序排列 的组合(由 product 决定),若需与提问中示例的顺序一致(如 x=2 时首行为 [1,0,1,0]),需对结果进行重排序。原示例实际对应的是“前半段为所有 x 位组合,但以格雷码或特定排列输出”,而本解法默认按标准二进制升序;如需严格匹配示例顺序,可在生成后按自定义规则索引重排(例如 result[[2,1,3,0]] 对 x=2 调整)。 时间与空间复杂度为 O(2^x × 2x),适用于中等规模 x(建议 x ≤ 20,避免内存溢出)。 不推荐使用 np.meshgrid 或 itertools.combinations:前者适用于多维坐标网格,后者仅生成固定数量的无序子集,均不契合“全排列 + 互补构造”这一核心需求。 总结:该方案以清晰的逻辑、最小的依赖和最优的向量化性能,精准满足“每行长度 2x、前后半段互为补集、覆盖全部 x 位组合”的要求,是处理此类对称二元结构的标准实践。

相关文章