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

如何高效获取超大二进制数组指定连续行切片(无需生成完整数组)

大维度二进制数组的局部切片高效获取方案

原代码可生成含i列、2**i行的二维数组,每行是从全0到全1的连续二进制数(左到右升序排列),示例中i=10时生成形状为(1024,10)的数组:

import numpy as np

i = 10
r = np.arange(2**i)   

out = (((r[:,None] & (1 << np.arange(i)))) > 0).astype(int)
out = out[:,::-1]    # 调整为左到右升序

但当i=30时,完整数组超10亿行,生成时会触发内存错误(提示"Unable to allocate 120 GiB..."),而实际仅需查看极小切片out[1006200:1006211]。

解决方案

无需生成完整大数组,直接针对目标行的数值,逐个转换为二进制位数组并调整顺序即可:

import numpy as np

i = 30
# 定义目标行的数值范围
start = 1006200
end = 1006211
r = np.arange(start, end)

# 对每个数生成二进制位,调整顺序并转为int
out_slice = (((r[:, None] & (1 << np.arange(i))) > 0).astype(int))[:, ::-1]

print(out_slice)

说明

  1. 仅生成需要的11个数值(1006200到1006210,共11个数),彻底避免10亿行的内存占用
  2. (r[:,None] & (1 << np.arange(i))) > 0提取每个数的二进制位,astype(int)将布尔值转为0/1格式
  3. [:,::-1]调整二进制位顺序,保证左到右为升序(最高位在左侧)

运行后输出即为形状(11,30)的目标切片,与期望格式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:12:58