如何在Python中将二进制向量旋转到最小

jje*_*omi 7 python arrays binary numpy bit-shift

如果我在Python中有一个任意二进制向量(numpy数组),例如

import numpy as np

vector = np.zeros((8,1))
vector[2,1] = 1
vector[3,1] = 1 
Run Code Online (Sandbox Code Playgroud)

这将给我二进制数组00001100.我也可以有00000000或00010100等.如何制作这样一个脚本,当我将这个二进制向量作为输入时,脚本给出最小的右旋二进制numpy数组作为输出?几个例子:

00010000 --> 00000001
10100000 --> 00000101
11000001 --> 00000111
00000000 --> 00000000
11111111 --> 11111111
10101010 --> 01010101
11110000 --> 00001111
00111000 --> 00000111
10001111 --> 00011111
Run Code Online (Sandbox Code Playgroud)

等任何建议/优化的Python实现?=)谢谢你的帮助.我需要这个本地二进制模式实现=)

HYR*_*YRY 5

最快的方法是首先创建一个表,然后你可以使用ndarray索引来获得结果,这里是代码:

你需要自己创建表,这里的代码只是一个演示

import numpy as np
np.random.seed(0)

#create the table
def rotated(s):
    for i in range(len(s)):
        s2 = s[i:] + s[:i]
        if s2[-1] == "1":
            yield int(s2, 2)

bitmap = []
for i in range(256):
    s = "{:08b}".format(i)
    try:
        r = min(rotated(s))
    except ValueError:
        r = i
    bitmap.append(r)

bitmap = np.array(bitmap, np.uint8)
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用bitmapnumpy.packbits()numpy.unpackbits():

a = np.random.randint(0, 2, (10, 8))
a = np.vstack((a, np.array([[1,1,0,0,0,0,0,1]])))
b = np.unpackbits(bitmap[np.packbits(a, axis=1)], axis=1)
print a
print
print b
Run Code Online (Sandbox Code Playgroud)

这是输出:

[[0 1 1 0 1 1 1 1]
 [1 1 1 0 0 1 0 0]
 [0 0 0 1 0 1 1 0]
 [0 1 1 1 1 0 1 0]
 [1 0 1 1 0 1 1 0]
 [0 1 0 1 1 1 1 1]
 [0 1 0 1 1 1 1 0]
 [1 0 0 1 1 0 1 0]
 [1 0 0 0 0 0 1 1]
 [0 0 0 1 1 0 1 0]
 [1 1 0 0 0 0 0 1]]

[[0 1 1 0 1 1 1 1]
 [0 0 1 0 0 1 1 1]
 [0 0 0 0 1 0 1 1]
 [0 0 1 1 1 1 0 1]
 [0 1 0 1 1 0 1 1]
 [0 1 0 1 1 1 1 1]
 [0 0 1 0 1 1 1 1]
 [0 0 1 1 0 1 0 1]
 [0 0 0 0 0 1 1 1]
 [0 0 0 0 1 1 0 1]
 [0 0 0 0 0 1 1 1]]
Run Code Online (Sandbox Code Playgroud)

  • 你是否肯定字符串切片和连接比位移和位测试更快?为什么这个最快? (2认同)