如何在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
相关产品推荐
相关产品推荐

