python - 从一系列数字生成二进制数据数组

标签 python arrays pandas numpy binary

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

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

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

最终目标是为不同位宽、编码和符号使用的每个位位置的转换数量创建一组带标签的摘要 n 元语法。例如 1 的摘要 n 元语法将是 {3 位,八进制,无符号,[1, 3, 7]}。示例 3 的摘要 n 元语法为 {4 位,八进制,有符号,[1, 2, 6, 13]}。示例 4 为 {4 位,十六进制,有符号,[1, 2, 6, 13]}。

示例:
1) 8x3 所有可能的 3 位无符号八进制值的二进制数组:
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) 8x4 所有可能的 4 位无符号八进制值的二进制数组:
与 #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) 所有可能的 4 位有符号十六进制值的 16x4 二进制数组:
与#3相同

最佳答案

例如,您可以使用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)

关于python - 从一系列数字生成二进制数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47684650/

相关文章:

php - 从具有相同键的子数组创建数组?

php - 如何从数组中获取准确的值 - php

python - Pyspark 数据框使用默认值左连接

python - 分组多索引上的滚动平均值(扩展其窗口)

python - 将 Pandas 部署到 Heroku?

python - 在 python 交互式 shell 中实现类似于 "help"命令的类似操作

javascript - 如何对对象数组中的键进行排序并仅渲染一个对象

python - 使用 Pandas 向 csv 文件添加独立标题

python - Django - TemplateDoesNotExist 在

python - python中遇到指定单词时如何在txt中添加\n