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

如何在Python中更优雅地高效创建指定长度与True数量的随机bool数组?

高效创建指定长度和True数量的随机bool数组

想要在Python中高效创建一个指定长度、指定True值数量的随机bool数组,没能找到可直接实现的单条命令,以下是两种自行实现的方法:

import numpy as np

def randbool(length,numtrue):
    index_array=np.random.choice(length,numtrue,replace=False)
    bool_array=np.zeros(length,dtype=bool)
    bool_array[index_array]=True
    return(bool_array)

def randbool2(length,numtrue):
    bool_array=np.hstack((np.tile(True,numtrue),np.tile(False,length-numtrue)))
    np.random.shuffle(bool_array)
    return(bool_array)

print(randbool(5,2))
print(randbool2(5,2))

更优雅的实现方式

如果要保证精确的True值数量,可以基于现有思路做简化,让代码更简洁直观:

方法1:简化索引赋值法

def randbool_elegant(length, numtrue):
    bool_arr = np.zeros(length, dtype=bool)
    bool_arr[np.random.choice(length, numtrue, replace=False)] = True
    return bool_arr

直接合并数组初始化和赋值步骤,去掉多余变量名,逻辑更紧凑。

方法2:简化拼接洗牌法

用np.full替代np.tile(语义更清晰,专门用于创建指定重复值的数组),结合np.r_快速拼接:

def randbool_elegant(length, numtrue):
    bool_arr = np.r_[np.full(numtrue, True), np.full(length - numtrue, False)]
    np.random.shuffle(bool_arr)
    return bool_arr

也可以用np.random.permutation一步完成拼接和洗牌:

def randbool_elegant(length, numtrue):
    return np.random.permutation(np.concatenate([np.full(numtrue, True), np.full(length - numtrue, False)]))

效率说明

  • 索引赋值法(你的第一种方法及简化版)在数组长度较大时内存效率更高,无需额外存储拼接后的临时数组。
  • 拼接洗牌法代码更简洁直观,适合大多数场景,常规长度下性能差异可忽略。

内容的提问来源于stack exchange,提问作者Okapi575

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:15:48