Skip to main content
 首页 » 编程设计

python之将 Numpy 数组的 0 填充到最接近的 2 的幂

2025年05月04日8开发

问题:

如何在开头快速向大型数组(约 600 000 个条目)添加 0,以使数组的长度达到 2 的下一个幂。 (2^n) 除了 np.concatinate() 有没有更快的解决方案?

我已经尝试过的:

  • 使用 np.concatenate(0, arr) 函数直到数组的长度等于 2 的下一次幂。我的代码有效,只需要很长时间。

这是 pad left 函数:

def PadLeft(arr): 
    nextPower = NextPowerOfTwo(len(arr)) 
    deficit = int(math.pow(2, nextPower) - len(arr)) 
    #for x in range(1, int(deficit)): 
    for x in range(0, deficit):     
        arr = np.concatenate(([0], arr)) 
    return arr 

这是两个函数的下一个幂:

def NextPowerOfTwo(number): 
    # Returns next power of two following 'number' 
    return math.ceil(math.log(number,2)) 

我的实现:

arr = np.ones(()) 
a = PadLeft(arr) 

谢谢!

请您参考如下方法:

与其在 for 循环中用单个元素扩展旧数组,不如一次添加整个零集?

arr = np.concatenate((np.zeros(deficit, dtype=arr.dtype), arr)) 

所以不要使用 for 循环。这就是您的代码运行缓慢的地方,因为它每次迭代都会创建一个新数组,这远不如一次创建所需大小的数组然后根据需要填充它效率低,这可以通过多种方式完成。这只是一个,接近您自己的解决方案的一个。

添加 dtype=arr.dtype 的原因是因为 np.zeros 将返回一个 np.float 的数组dtype 默认。如果 arr 的数据类型“小于”(在转换意义上),结果将被转换为“更广泛”的数据类型,即 float ,这通常不是您想要的(因为它会自动发生)。 这个有效的观点是由 Divakar 在下面的评论中提出的。