旋转a数字阵列一点点就好了

2024-10-01 17:38:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy.array,想把它的内容向右旋转一位。我希望尽可能高效地执行此操作(在执行速度方面)。另外,请注意数组的每个元素都是一个8位数字(np.uint8)。旋转假设数组存储一个大数,它被分成8位大小的块,也就是说,我不想单独旋转每个8位元素,而是将整个数组一起旋转。在

下面是一个消除混淆的示例:

a = numpy.array([0b00000000, 0b00000001])
# rotation should be performed globally
# i.e., the result should be
# rotate(a) == numpy.array([0b10000000, 0b00000000])

我是如何解决这个问题的?

方法1:将输入数组转换为二进制表示,并将元素的二进制字符串链接为一个大字符串。然后弹出最低有效位并将其插入最高有效位之前。最后,将大字符串切分为8位块,将每个块转换为np.uint8,并将其存储在旋转结果的相应位置。我想这个解决方案是正确的,但是没有效率,尤其是当输入数组很大的时候。在

方法2:我发现很难用语言来解释这个想法,所以我试着用下面的代码片段来表达:

^{pr2}$

我的问题:在执行速度方面,有没有更好的方法来实现这种旋转?在

谢谢大家。在


Tags: 方法字符串numpy元素内容np二进制数字
1条回答
网友
1楼 · 发布于 2024-10-01 17:38:10

您可以通过减少临时存储器的内存分配量来加快“方法2”:

def method2a(w):
    rotW = np.right_shift(w, 1)
    lsb = np.bitwise_and(w, 1)
    np.left_shift(lsb, 7, lsb)
    rotW[0] |= lsb[-1]
    rotW[1:] |= lsb[:-1]
    return rotW

在我的系统中,使用1MB的输入数组,速度是原来的两倍,并且产生相同的结果。在

如果您愿意销毁输入,您可以消除剩下的两个分配中的一个(也许通过添加一个可选的out参数,就像NumPy在left_shift()中所做的那样)。在

相关问题 更多 >

    热门问题