我需要创建 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/