给定一个一维整数数组,例如:
[1, 0, -1]
寻找二进制表示矩阵,期望输出:
[[0 1], [0 0], [1 1]]
可能使用 np.binary_repr具有给定的固定宽度。目前 np.binary_repr
返回一个字符串并且一次只适用于一个数字。
tobin = np.vectorize(np.binary_repr)
tobin(np.arange(4))
# ['0000' '0001' '0010' '0011']
最佳答案
您可以使用 np.unpackbits :
a=np.array([-1,0,1]) # dtype is np.int32
您必须将数据输入为 np.uint8
,因为这是 unpackbits 唯一支持的数据类型:
bi = np.unpackbits(a[:,None].view(np.uint8), axis=1)
原始输入数据为 32 位,因此每个输入元素获得 32 个值,相应地裁剪(记住 a
中的最小/最大值):
result = bi[:, :8]
array([[1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1]], dtype=uint8)
编辑:
这对于像答案中的数字这样的小数字很有效。如果需要超过 8 位,则应读取 bi
的前 8 个元素,然后读取第 16 到第 8 个元素。有点乱。
对于更通用的解决方案,最好翻转数组 View
。在解包之前裁剪会给你一些性能改进:
def int_to_bin(arr, n_bytes=1):
# arr is 1-D
arr_ = np.fliplr(arr[:, None].view(np.uint8))[:, -n_bytes:]
return np.unpackbits(arr_, axis=1)
如果你想要,你可以进一步裁剪输出,比如说,只有 4 位。对于 int32
的一百万 arr
,这大约需要 10 毫秒。
关于python - 将整数数组转换为二进制表示矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56970330/