我需要创建布尔/二进制数组,行表示给定范围内每个数字的二进制形式。每一列都保存给定位位置的值。范围由位宽和二进制编码方案决定.然后,我需要计算列中与前一个单元格不匹配的单元格数。
我相信计数过程只是简单的XORing数组,其本身向下移动了一行。XOR结果中每一列的和是我的转换计数。
我需要对以十六进制、八进制、十进制编码的每个有符号、无符号值的组合执行此操作。编码方案与可用比特之间的不匹配导致不可用比特。
例如,4位无符号八进制数组仍然只有8行。但是,如果它是有符号的,那么第4位用于符号,数组是完整的16行。
最终目标是为不同位宽、编码和符号的使用在每个位位置上的转换数创建标记的汇总n-克集。例如,摘要n-克将是{3位,八进制,无符号,1,3,7}。摘要n-克,例如3是{4位,八进制,符号,1,2,6,13}.示例4是{4位,十六进制,签名,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和+0) 1 1 1
1 1 1 0
1 1 0 1
1 1 0
1 0 1 1
1 0 1 0
1 0 0 1
1 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号相同
发布于 2017-12-06 22:55:04
例如,您可以使用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])或者使用xor方法:
(x[1:]^x[:-1]).sum(axis=1)结果:
array([1, 2, 1, 3, 1, 2, 1], dtype=uint64)https://stackoverflow.com/questions/47684650
复制相似问题