【问题标题】:Generate Binary Data Array From a Range of Numbers从一系列数字生成二进制数据数组
【发布时间】:2018-05-20 22:42:03
【问题描述】:

我需要创建布尔/二进制数组,其中的行表示给定范围内每个数字的二进制形式。每列保存给定位位置的值。范围由位宽和二进制编码方案确定。然后我需要计算一列中与前一个单元格不匹配的单元格数。

我相信计数过程只是将数组与自身向下移动一行进行异或。 XOR 结果中每一列的总和就是我的转换计数。

我需要对编码为 [十六进制、八进制、十进制] 的 [有符号、无符号] 值的每个组合执行此操作。编码方案和可用位之间的不匹配会导致无法使用的位。
例如一个 4 位无符号八进制数组仍然只有 8 行。但是,如果它是有符号的,那么第 4 位用于符号,并且数组是完整的 16 行。

最终目标是为各种位宽、编码和符号使用的每个位位置的转换数创建标记的汇总 n-gram 集。例如 1 的摘要 n-gram 将是 {3-bit, octal, unsigned, [1, 3, 7]}。示例 3 的摘要 n-gram 是 {4-bit, octal, signed, [1, 2, 6, 13]}。示例 4 是 {4-bit, hexadecimal, signed, [1, 2, 6, 13]}。

示例:
1) 包含所有可能的 3 位无符号八进制值的 8x3 二进制数组:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

2) 所有可能的 4 位无符号八进制值的 8x4 二进制数组:
与 #1 相同,但最左边的一列全为零

3) 所有可能的 4 位有符号八进制值的 16x4 二进制数组:
注意:可以重复计数零(-0 和 +0) 1 1 1 1
1 1 1 0
1 1 0 1
1 1 0 0
1 0 1 1
1 0 1 0
1 0 0 1
1 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1

4) 16x4 二进制数组,包含所有可能的 4 位有符号十六进制值:
同#3

【问题讨论】:

    标签: python arrays pandas numpy binary


    【解决方案1】:

    你可以使用np.unpackbits,例如

    np.unpackbits(np.arange(8).astype(np.uint8)[:, None], axis = 1)
    

    输出:

    array([[0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 1],
           [0, 0, 0, 0, 0, 0, 1, 0],
           [0, 0, 0, 0, 0, 0, 1, 1],
           [0, 0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 1],
           [0, 0, 0, 0, 0, 1, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1]], dtype=uint8)
    

    切掉不需要的零:

    np.unpackbits(np.arange(8).astype(np.uint8)[:, None], axis = 1)[:, -3:]
    

    结果:

    array([[0, 0, 0],
           [0, 0, 1],
           [0, 1, 0],
           [0, 1, 1],
           [1, 0, 0],
           [1, 0, 1],
           [1, 1, 0],
           [1, 1, 1]], dtype=uint8)
    

    对有符号值使用模数:

    np.unpackbits((np.arange(-4, 4)%8).astype(np.uint8)[:, None], axis = 1)[:, -3:]
    

    或者查看从有符号到无符号的转换:

    np.unpackbits(np.arange(-4, 4).astype(np.int8).view(np.uint8)[:, None], axis = 1)[:, -3:]
    

    结果:

    array([[1, 0, 0],
           [1, 0, 1],
           [1, 1, 0],
           [1, 1, 1],
           [0, 0, 0],
           [0, 0, 1],
           [0, 1, 0],
           [0, 1, 1]], dtype=uint8)
    

    转换次数:

    x = np.unpackbits(np.arange(-4, 4).astype(np.int8).view(np.uint8)[:, None], axis = 1)[:, -3:]
    np.abs(np.diff(x.view(np.int8), axis=0)).sum(axis=1)
    

    结果:

    array([1, 2, 1, 3, 1, 2, 1])
    

    或者使用你的异或方法:

    (x[1:]^x[:-1]).sum(axis=1)
    

    结果:

    array([1, 2, 1, 3, 1, 2, 1], dtype=uint64)
    

    【讨论】:

    • 不错。我不知道解包位。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2018-07-15
    • 2016-09-29
    相关资源
    最近更新 更多