
本文介绍如何使用numpy和itertools高效生成长度为2x的二进制数组,其中每行的后x位是前x位的按位取反(即1→0、0→1),确保所有组合唯一且结构对称。
要构造一个形状为 (2^x, 2x) 的 NumPy 数组,使得每一行由两部分组成:前 x 位是任意 x 维 0-1 向量,后 x 位恰好是该向量的逻辑取反(即 1 - vector),最简洁可靠的方法是利用 itertools.product 生成所有 x 位二进制组合,再通过 np.column_stack 拼接原向量与其补向量。
以下是完整实现:
import numpy as np
from itertools import product
def generate_complementary_binary_array(x):
# 生成所有 x 维 0-1 组合:共 2^x 行,每行 x 列
base = np.array(list(product([0, 1], repeat=x)))
# 构造互补后半部分:1 - base(逐元素取反)
complement = 1 - base
# 水平拼接:shape (2^x, x) + (2^x, x) → (2^x, 2x)
return np.column_stack([base, complement])
# 示例: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]⚠️ 注意事项:
- 该方法生成的是前x位自由、后x位严格互补的数组,与问题中示例的输出顺序不同(例如 x=2 时示例以 [1,0,1,0] 开头,而本解法以 [0,0,1,1] 开头),但集合完全等价——只是排列顺序差异。若需严格匹配示例顺序(如按字典序或特定模式排序),可在生成后调用 np.argsort 或自定义排序逻辑。
- itertools.product([0,1], repeat=x) 时间复杂度为 O(2^x),适用于 x ≤ 20 左右;当 x 过大(如 > 24)时,内存可能成为瓶颈,此时建议改用生成器或分块处理。
- 不推荐使用 np.meshgrid 或 itertools.combinations,因前者生成笛卡尔积需额外 reshape,后者仅选子集不满足全排列需求。
总结:此方案简洁、可读性强、无冗余循环,充分利用了 Python 标准库与 NumPy 的向量化能力,是生成互补型二进制矩阵的标准实践。










