Python 对传入二进制输入进行分组的有效方法

Python 对传入二进制输入进行分组的有效方法,python,python-3.x,cluster-analysis,Python,Python 3.x,Cluster Analysis,我有一个源代码,它以000001010,000的形式随机生成二进制输出字符串 我想要一些散列或聚类程序,根据与其他输入不同的位数将输入分组,例如输入流000、001和010,由于它们相差一位,因此应全部进入相同的桶/簇 我最初的想法是将输入的第一个连续位组合成一个,例如 000 001 010 合并成一个。接下来是: 011 100 101 等 但我很快意识到边界之间有相似之处,比如000和1000应该属于同一个桶,而011和000应该属于不同的桶 我怎样才能做到这一点?暗示 詹姆斯使用格雷

我有一个源代码,它以
000001010,000
的形式随机生成二进制输出字符串

我想要一些散列或聚类程序,根据与其他输入不同的位数将输入分组,例如输入流000、001和010,由于它们相差一位,因此应全部进入相同的桶/簇

我最初的想法是将输入的第一个连续位组合成一个,例如

000
001
010
合并成一个。接下来是:

011
100
101

但我很快意识到边界之间有相似之处,比如
000
1000
应该属于同一个桶,而
011
000
应该属于不同的桶

我怎样才能做到这一点?暗示


詹姆斯使用格雷码

反射二进制码,也称为弗兰克·格雷之后的格雷码,是一种二进制数字系统,其中两个连续值仅在一位上不同

这将导致三位(以及相关整数-这不是默认的二进制编码!)的顺序如下:

然后将数据按所需的桶数线性拆分


或者,您可能还想看看校验和和纠错码。

对不起,对于您的特殊情况,我没有找到一个函数,但在这里您可以得到一些启示:

如果你想拥有一个依赖于一个数字的bucket函数,你可以这样做:

def bucket(i):
    bucket = 0
    bit = 1
    while bit <= i:
        if bit & i > 0:
            bucket += 1
        bit <<= 1 # shift the bit 1 higher
    return bucket

如果你在谷歌上搜索“在线集群”,这应该会给你一些想法。这在数学上不可行吗。如果我误解了你,请纠正我:你想把“000”和“010”放在同一个桶里(一点区别)。您希望“010”和“011”在同一个存储桶中(一个位差)。因此,“000”和“011”也将在同一个桶中,但根据您的规范,这是不允许的。@NPE,@Anony mouse感谢这两个。我在网上读了一点,发现我可以尝试XOR函数。e、 g如果不同位的数量为2,那么XOR将按如下方式对输入进行聚类:
(00001110110)
(001010、100、111)
,因为它们对应的XOR函数将产生2位1。然后,我的问题仍然是如何使用这种技术,以便在新的二进制流到达时,将它们定向到有效的clustersWell,然后尝试使用格雷码。将位字符串映射到整数,并使用
decode(bitstring)/bucketsize
作为存储桶编号…我将尝试并在明天更新。现在差不多是午夜了,为了让我更清楚,我应该将二进制代码转换成格雷码,然后得到它的整数值,并使用整数值进行散列?如果位字符串还不是整数,请将其转换为整数。然后将它从一个灰色编码的整数解码为一个本机系统整数(这样你就可以用它做数学运算了)。只需在上面的例子中尝试一下。。。位字符串应该给出您想要的结果,可能您希望前三个变为0,后三个变为1,以此类推。
def bucket(i):
    bucket = 0
    bit = 1
    while bit <= i:
        if bit & i > 0:
            bucket += 1
        bit <<= 1 # shift the bit 1 higher
    return bucket
def bucket(i, x):
    # perform some operation, store it in i
    bucket = 0
    bit = 1
    while bit <= i:
        # you can compare bits here
        if bit & i > 0:
            bucket += 1
    bit <<= 1
    return bucket
buckets = {}
for number in numbers:
    numberBucket = bucket(number)
    buckets.setdefault(numberBucket, [])
    buckets[numberBucket].append(number)