numpy 计算数组中太大而无法存储的一小部分

jljoyd4f  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

考虑下面的代码。它创建了一个具有i列和2**i行的2d数组。在本例中,形状为(10,1024)。行显示从[0,0,0,0,0,0,0,0,0,0][1,1,1,1,1,1,1,1,1,1]的连续二进制数,按升序列出(从左到右)。然后我使用切片来检查小范围的连续数组行(例如:out[990:995])。一切都按预期工作。

import numpy as np

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

out = (((r[:,None] & (1 << np.arange(i)))) > 0).astype(int)
out = out[:,::-1]    # for ascending left to right

字符串
问题是:i的实际值可能更大(比如i=30,产生超过10亿行),所以我不想一直创建一个巨大的数组,只检查它的一小部分。

问题:假设i=30,我需要找到out[1006200:1006211]。有没有一种方法可以有效地做到这一点而无需计算整个数组?

对于它的价值,所需的输出将是一个数组的形状(11,30):

[[0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1]
 [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0]
 ...

 [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1]
 [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0]]

vqlkdk9b

vqlkdk9b1#

根据low/high边界计算动态范围:

def calc_on_range(low, high, i=10):
    r = np.arange(low, high)
    out = (((r[:, None] & (1 << np.arange(i)))) > 0).astype(int)
    return out[:, ::-1]

print(calc_on_range(low=1006200, high=1006211, i=30))

个字符

相关问题