如何高效获取超大二进制数组指定连续行切片(无需生成完整数组)
大维度二进制数组的局部切片高效获取方案
原代码可生成含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)
说明
- 仅生成需要的11个数值(
1006200到1006210,共11个数),彻底避免10亿行的内存占用 (r[:,None] & (1 << np.arange(i))) > 0提取每个数的二进制位,astype(int)将布尔值转为0/1格式[:,::-1]调整二进制位顺序,保证左到右为升序(最高位在左侧)
运行后输出即为形状(11,30)的目标切片,与期望格式完全一致。
内容的提问来源于stack exchange,提问作者user109387
相关产品推荐
相关产品推荐

