Python Numpy阵列的0号焊盘到最接近的2次方

Python Numpy阵列的0号焊盘到最接近的2次方,python,arrays,numpy,Python,Arrays,Numpy,问题: 如何在开始时将0快速添加到一个大数组~600000个条目,以使数组长度达到下一个2的幂。2^n除了np.concatate,还有更快的解决方案吗 我已经尝试过的: 使用np.concatenate0,arr函数,直到数组长度等于2的下一次幂。我的代码很有效,只是需要很长时间。 以下是pad left功能: 下面是两个函数的下一个幂: 我的实施: 谢谢 与其用单个元素扩展for循环中的旧数组,为什么不一次添加整个零集 arr = np.concatenate((np.zeros(defic

问题:

如何在开始时将0快速添加到一个大数组~600000个条目,以使数组长度达到下一个2的幂。2^n除了np.concatate,还有更快的解决方案吗

我已经尝试过的:

使用np.concatenate0,arr函数,直到数组长度等于2的下一次幂。我的代码很有效,只是需要很长时间。 以下是pad left功能:

下面是两个函数的下一个幂:

我的实施:


谢谢

与其用单个元素扩展for循环中的旧数组,为什么不一次添加整个零集

arr = np.concatenate((np.zeros(deficit, dtype=arr.dtype), arr))
所以不要使用for循环。这就是代码运行缓慢的地方,因为它每次迭代都会生成一个新数组,这远远低于生成一次所需大小的数组然后根据需要填充它的效率,这可以通过多种方式完成。这只是一个,一个接近你自己的解决方案

添加dtype=arr.dtype的原因是,默认情况下,np.zeros将返回一个属于np.float dtype的数组。如果arr的数据类型小于强制转换意义上的数据类型,则结果将强制转换为更广泛的数据类型,即float,这通常不是您想要的,因为它是自动发生的。
Divakar在下面的评论中指出了这一点。

与其用单个元素扩展for循环中的旧数组,为什么不一次添加整个零集呢

arr = np.concatenate((np.zeros(deficit, dtype=arr.dtype), arr))
所以不要使用for循环。这就是代码运行缓慢的地方,因为它每次迭代都会生成一个新数组,这远远低于生成一次所需大小的数组然后根据需要填充它的效率,这可以通过多种方式完成。这只是一个,一个接近你自己的解决方案

添加dtype=arr.dtype的原因是,默认情况下,np.zeros将返回一个属于np.float dtype的数组。如果arr的数据类型小于强制转换意义上的数据类型,则结果将强制转换为更广泛的数据类型,即float,这通常不是您想要的,因为它是自动发生的。 Divakar在下面的评论中提出了这一有效观点。

确实有这样的观点

对于一维阵列:

arr = np.pad(arr, (deficit,0), mode='constant')
它读作左,右填充

对于二维阵列:

arr = np.pad(arr, ((0,0), (deficit,0)), mode='constant')
第二个参数显示为top、bottom、left、right。它在数组的左边填充了赤字。

有一个正是这样做的

对于一维阵列:

arr = np.pad(arr, (deficit,0), mode='constant')
它读作左,右填充

对于二维阵列:

arr = np.pad(arr, ((0,0), (deficit,0)), mode='constant')

第二个参数显示为top、bottom、left、right。它在数组的左侧填充了赤字。

完全利用NumPy,下面是一种初始化方法-

def NextPowerOfTwo(number):
    # Returns next power of two following 'number'
    return np.ceil(np.log2(number))

def PadLeft_with_initialization(arr):
    nextPower = NextPowerOfTwo(len(arr))
    deficit = int(np.power(2, nextPower) - len(arr))
    out = np.zeros(deficit+len(arr),dtype=arr.dtype)
    out[deficit:] = arr
    return out
运行时测试

让我们对本文中提出的解决方案计时,并将基于np.CONTAINATE的解决方案列在:

时间安排-

In [226]: arr = np.random.randint(0,9,(600000))

In [227]: %timeit PadLeft_with_concatente(arr)
100 loops, best of 3: 5.21 ms per loop

In [228]: %timeit PadLeft_with_initialization(arr)
100 loops, best of 3: 6.75 ms per loop

由于更干净、更快,我认为Oliver W.使用np.concatenate的解决方案将是一条可行之路。

完全利用NumPy,下面是一种初始化方法-

def NextPowerOfTwo(number):
    # Returns next power of two following 'number'
    return np.ceil(np.log2(number))

def PadLeft_with_initialization(arr):
    nextPower = NextPowerOfTwo(len(arr))
    deficit = int(np.power(2, nextPower) - len(arr))
    out = np.zeros(deficit+len(arr),dtype=arr.dtype)
    out[deficit:] = arr
    return out
运行时测试

让我们对本文中提出的解决方案计时,并将基于np.CONTAINATE的解决方案列在:

时间安排-

In [226]: arr = np.random.randint(0,9,(600000))

In [227]: %timeit PadLeft_with_concatente(arr)
100 loops, best of 3: 5.21 ms per loop

In [228]: %timeit PadLeft_with_initialization(arr)
100 loops, best of 3: 6.75 ms per loop

更干净、更快,我认为Oliver W.的np.concatenate解决方案是最好的选择。

用零初始化输出数组,然后在其中设置值?我正在处理的数组长度不同,所以我希望在后面完成!我的意思是:out=np.zerosdeficit+lenarr,dtype=arr.dtype;out[defect:]=arr模拟PadLeftarr IIUC的输出。用零初始化一个输出数组,然后在其中设置值?我正在处理的数组有不同的长度,所以我希望在后面完成!我的意思是:out=np.zerosdeficit+lenarr,dtype=arr.dtype;out[defect:]=arr模拟PadLeftarr IIUC的输出。要将数据类型保留为输入数组,请使用,dtype=arr.dtype和np.zero?与基于初始化的时间比较,这似乎同样快,甚至更快。我认为这确实与您的初始化建议类似,请将其作为一个答案,好吗?我想向上投票,因为这是一个很好的答案,因为在屏幕后面需要执行相同/类似的操作。dis可能会对此进行关闭,但我这里没有python shell…补充道。但是如果你能在文章中为arr是int数组的情况添加dtype,我想是有意义的,因为np.zerosdeficit将默认为浮点数组,在连接之后仍然是浮点数组。@Divakar,完成了,谢谢你添加解决方案。向上投票-要将数据类型保留为输入数组,请使用,dtype=arr.dtype和np.zero?与基于初始化的时间比较,这似乎同样快,甚至更快。我认为这确实与您的初始化建议类似,请将其作为一个答案,好吗?我想和你谈谈
pvote,因为这是一个很好的答案,因为在屏幕后面需要执行相同/类似的操作。dis可能会对此进行关闭,但我这里没有python shell…补充道。但是如果你能在文章中为arr是int数组的情况添加dtype,我想是有意义的,因为np.zerosdeficit将默认为浮点数组,在连接之后仍然是浮点数组。@Divakar,完成了,谢谢你添加解决方案。向上投票-