本文介绍如何使用numpy和itertools高效生成长度为2x的二进制数组,其中每行的后x位是前x位的按位取反(即1→0、0→1),确保所有组合唯一且结构对称。
要构造一个形状为 (2^x, 2x) 的 Nu
mPy 数组,使得每一行由两部分组成:前 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]⚠️ 注意事项:
总结:此方案简洁、可读性强、无冗余循环,充分利用了 Python 标准库与 NumPy 的向量化能力,是生成互补型二进制矩阵的标准实践。