python - 将整数数组转换为二进制表示矩阵

标签 python numpy

给定一个一维整数数组,例如:

[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/

相关文章:

python - 在python中创建圆圈来掩盖图像并计算每个圆圈内的像素

python - 两个数组的交集,保留较大数组中的顺序

python - 在主循环外广播加速矢量化 numpy 操作?

python - 两个数组之间的逐元素内运算符

python - 名称错误 : global name 'numpy' is not defined

python - 设置属性和调用就地变异方法之间的区别?

python - 正则表达式中的原始字符串表示法

Python 中值滤波器应用于 3D 数组以产生 2D 结果

python - 一维数组上的 numpy apply_along_axis

python - 导入tensorflow使python 3.6.5报错