Python 零填充数据,直到其长度等于2的幂
我试图写一个函数,它可以对一些数据进行零填充,直到它的长度等于最接近的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
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])