问题:
如何在开头快速向大型数组(约 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 在下面的评论中提出的。
