垫0的Numpy阵列到最近的两个力量

jac*_*kis 1 python arrays numpy

题:

如何在开始时快速将0添加到大型数组(~600 000个条目)中,以使数组的长度达到下一个2的幂.(2 ^ n)除了np.concatinate()之外还有更快的解决方案吗?

我已经尝试过的:

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

这是垫左功能:

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)

谢谢!

Oli*_* W. 6

不是在具有单个元素的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


Ima*_*ngo 5

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)).这个阵列填补了左边的缺陷.