Python 零填充数据,直到其长度等于2的幂

Python 零填充数据,直到其长度等于2的幂,python,performance,function,Python,Performance,Function,我试图写一个函数,它可以对一些数据进行零填充,直到它的长度等于最接近的2的高次方。我还希望能够对此进行一定次数的迭代。现在这是我的功能: def pad_to_next_2n(array, iterations = 1): n = 1 while n <= iterations: l = len(array) padding = l +1 #incase array is already length equal to 2^n

我试图写一个函数,它可以对一些数据进行零填充,直到它的长度等于最接近的2的高次方。我还希望能够对此进行一定次数的迭代。现在这是我的功能:

def pad_to_next_2n(array, iterations = 1):
    n = 1
    while n <= iterations:
        l = len(array)
        padding = l +1 #incase array is already length equal to 2^n
        while np.log2(padding) % 1 != 0:
            padding += 1
        if l % 2 == 0:
            total_padding = padding - l
            array =  np.pad(array, (total_padding/2,), 'constant')
            n += 1
        else:
            total_padding = padding - l
            left_padding = (total_padding - 1)/2
            right_padding = total_padding - left_padding
            print total_padding
            print left_padding
            print right_padding
            array = np.pad(array, (left_padding, right_padding), 'constant')
            n += 1
    return array

部分,但我不确定如何使其更有效。

您不必通过每次增加一个填充来进行迭代。计算一下你需要的下一个尺码。下一个总大小是
2**int(log2(当前大小)+1)


然后你可以减去当前的大小,知道你需要多少填充空间。

你不需要做很多你正在做的事情-你只需要找出下一个2的幂,你需要扩展数组的长度,然后你可以调用数组上的
pad
,一次性填充到你需要的长度

这使用了另一个问题中关于在Python中获得2的下一个幂的最快方法

import numpy as np

def shift_bit_length(x):
    return 1<<(x-1).bit_length()

def padpad(data, iterations = 1):
    narray = data
    for i in xrange(iterations):
        length = len(narray)
        diff = shift_bit_length(length + 1) - length
        if length % 2 == 0:
            pad_width = diff / 2
        else:
            # need an uneven padding for odd-number lengths
            left_pad = diff / 2
            right_pad = diff - left_pad
            pad_width = (left_pad, right_pad)
        narray = np.pad(narray, pad_width, 'constant')
    return narray

不清楚你所说的“我总是希望能够进行一定次数的迭代”是什么意思。为什么不一次计算出最终的大小(
2**(int(np.log2(padding))+1)
可以做到这一点)然后填充数组呢?我的意思是,它也不总是可以更有效/直接地计算表示值所需的位(并且避免不太可能的浮点错误)<代码>1这仅适用于长度为偶数的数组。它能处理奇数长度数组吗?@greenthumbtack-Whoops-添加了支持奇数长度数组的代码(改编自您的原始代码)。
import numpy as np

def shift_bit_length(x):
    return 1<<(x-1).bit_length()

def padpad(data, iterations = 1):
    narray = data
    for i in xrange(iterations):
        length = len(narray)
        diff = shift_bit_length(length + 1) - length
        if length % 2 == 0:
            pad_width = diff / 2
        else:
            # need an uneven padding for odd-number lengths
            left_pad = diff / 2
            right_pad = diff - left_pad
            pad_width = (left_pad, right_pad)
        narray = np.pad(narray, pad_width, 'constant')
    return narray
>> arr = np.array([1, 2])

>> padpad(arr, 1)
Out[2]: array([0, 1, 2, 0])

>> len(padpad(arr, 1)
Out[3]: 4

>> padpad(arr, 5)
Out[4]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

>> len(padpad(arr, 5))
Out[5]: 32

>> padpad(arr, 8)
Out[6]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0])