生成指定长度的0-1组合数组:构造每行含x个1和x个0的所有唯一排列
发布时间 - 2025-12-25 00:00:00 点击率:次本文介绍如何使用numpy与itertools高效生成所有长度为2x、且恰好包含x个1和x个0的二进制行向量组成的二维数组,适用于组合枚举、约束排列生成等场景。
您提供的示例中,当 x=2 时输出4行、每行4列(即 2*x=4),且每行恰好含两个1和两个0;同理,x=3 时每行6列、含三个1和三个0。但需注意:原始答案中使用的 np.column_stack([a, 1 - a]) 实际生成的是「前x位与后x位互补」的结构(如 [0,1,1,0]),这虽满足总长2x、总和为x,但并非穷举所有含x个1的组合——它仅覆盖了“前半段任意、后半段取反”的子集(共 2^x 种),而完整组合数应为 C(2x, x)(例如 x=3 时为 C(6,3)=20,但示例只列出8行)。
因此,正确解法应分为两类需求:
✅ 需求一:生成所有长度为 2x、恰含 x 个 1 的二进制向量(完整组合)
推荐使用 itertools.combinations 枚举 1 的位置索引,再用 NumPy 构造稀疏行:
import numpy as np
from itertools import combinations
def binary_arrays_with_x_ones(x):
n = 2 * x
# 生成所有从 [0, 1, ..., 2x-1] 中选 x 个位置置1的组合
ones_positions = list(combinations(range(n), x))
# 初始化全零数组
arr = np.zeros((len(ones_positions), n), dtype=int)
# 向每行对应位置填1
for i, pos in enumerate(ones_positions):
arr[i, list(pos)] = 1
return arr
# 示例:x = 2 → 输出 6 行(C(4,2)=6),非原题所示4行
print(binary_arrays_with_x_ones(2))
# [[1 1 0 0]
# [1 0 1 0]
# [1 0 0 1]
# [0 1 1 0]
# [0 1 0 1]
# [0 0 1 1]]⚠️ 注意:原问题示例输出仅含4行(x=2)或8行(x=3),实为 “前x位任意,后x位为前x位的按位取反” 的特殊结构(即 a + (1-a) 拼接),其本质是 2^x 种模式,而非 C(2x,x)。若此结构即您的真实需求,则原始答案正确:
✅ 需求二:生成“前x位任意、后x位为其逻辑反”的数组(即 a | (1-a) 拼接)
from itertools import product import numpy as np def binary_arrays_complementary(x): # 生成所有长度为x的0-1组合 a = np.array(list(product([0, 1], repeat=x))) # 拼接:前x位为a,后x位为1-a(逐元素取反) return np.hstack([a, 1 - a]) print(binary_arrays_complementary(2)) # [[0 0 1 1] # [0 1 1 0] # [1 0 0 1] # [1 1 0 0]]
该结果与您原始答案一致,但顺序和数值与题干示例不完全匹配(题干以 [1,0,1,0] 开头,而此处以 [0,0,1,1] 开头)。可通过排序或自定义排列调整,例如按字典序逆序或按特定模式筛选。
? 总结与建议
- 若目标是数学意义上的所有含x个1的2x维二进制向量 → 用 combinations(range(2*x), x)(推荐,完备且直观);
- 若目标是前后对称互补结构(如编码中的自反码) → 用 product([0,1], repeat=x) 拼接取反;
- 避免 np.meshgrid 或盲目 product(*[[0,1]]*2x)(会生成 2^(2x) 行,远超需求,且需后过滤);
- 对于大 x(如 x > 15),内存敏感场景建议使用生成器替代 list(...),或借助 numba/dask 加速。
最终选择取决于您的实际约束条件——请优先确认:是否必须严格满足“每行1的数量 = x”,还是仅需满足“前x位 + 后x位互为补集”这一更强对称性。
# 编码
# 排列
# numpy
# 您的
# 长度为
# 的是
# 穷举
# 这一
# 推荐使用
# 适用于
# 自定义
# 为其
# 所示
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Laravel如何配置任务调度?(Cron Job示例)
网站图片在线制作软件,怎么在图片上做链接?
如何解决hover在ie6中的兼容性问题
清除minerd进程的简单方法
Laravel怎么在Blade中安全地输出原始HTML内容
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
详解jQuery中基本的动画方法
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
如何快速辨别茅台真假?关键步骤解析
Laravel怎么实现验证码(Captcha)功能
javascript基于原型链的继承及call和apply函数用法分析
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Laravel Session怎么存储_Laravel Session驱动配置详解
如何在服务器上配置二级域名建站?
如何在阿里云完成域名注册与建站?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
昵图网官网入口 昵图网素材平台官方入口
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
C#如何调用原生C++ COM对象详解
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Windows Hello人脸识别突然无法使用
南京网站制作费用,南京远驱官方网站?
EditPlus中的正则表达式实战(5)
Laravel如何为API生成Swagger或OpenAPI文档
Android自定义listview布局实现上拉加载下拉刷新功能
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Laravel如何使用查询构建器?(Query Builder高级用法)
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
python中快速进行多个字符替换的方法小结
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
北京专业网站制作设计师招聘,北京白云观官方网站?
lovemo网页版地址 lovemo官网手机登录
如何在VPS电脑上快速搭建网站?
Laravel如何使用Sanctum进行API认证?(SPA实战)
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何选择可靠的免备案建站服务器?


rrays_complementary(x):
# 生成所有长度为x的0-1组合
a = np.array(list(product([0, 1], repeat=x)))
# 拼接:前x位为a,后x位为1-a(逐元素取反)
return np.hstack([a, 1 - a])
print(binary_arrays_complementary(2))
# [[0 0 1 1]
# [0 1 1 0]
# [1 0 0 1]
# [1 1 0 0]]