jac*_*kis 1 python arrays numpy
题:
如何在开始时快速将0添加到大型数组(~600 000个条目)中,以使数组的长度达到下一个2的幂.(2 ^ n)除了np.concatinate()之外还有更快的解决方案吗?
我已经尝试过的:
这是垫左功能:
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
Run Code Online (Sandbox Code Playgroud)
这是两个功能的下一个功能:
def NextPowerOfTwo(number):
# Returns next power of two following 'number'
return math.ceil(math.log(number,2))
Run Code Online (Sandbox Code Playgroud)
我的实施:
arr = np.ones(())
a = PadLeft(arr)
Run Code Online (Sandbox Code Playgroud)
谢谢!
不是在具有单个元素的for循环中扩展旧数组,为什么不一次添加整个零?
arr = np.concatenate((np.zeros(deficit, dtype=arr.dtype), arr))
Run Code Online (Sandbox Code Playgroud)
所以不要使用for循环.这就是你的代码运行缓慢的地方,因为它在每次迭代时都会生成一个新数组,这比制作一次所需大小的数组然后根据需要填充它要低得多,这可以通过多种方式完成.这只是一个,与您自己的解决方案接近.
dtype=arr.dtype添加原因是因为默认情况下np.zeros会返回一个np.floatdtype 数组.如果数据类型"小于"(在铸造意义上),则结果将转换为"更宽"的数据类型,即浮点数,这通常不是您想要的(因为它会自动发生).这个有效点是由Divakar在下面的评论中提出的.arr
有numpy.pad就是这么做的.
对于1D阵列:
arr = np.pad(arr, (deficit,0), mode='constant')
Run Code Online (Sandbox Code Playgroud)
它读作(left, right)填充.
对于2D arrray:
arr = np.pad(arr, ((0,0), (deficit,0)), mode='constant')
Run Code Online (Sandbox Code Playgroud)
第二个参数读作((top, bottom), (left, right)).这个阵列填补了左边的缺陷.