【问题标题】:convert each element in array to binary python将数组中的每个元素转换为二进制python
【发布时间】:2022-02-09 00:55:58
【问题描述】:

我有一个 np 数组 (100,100 dtype=unit8),我想将每个元素转换为 8 位表示的二进制。

我查看了下面的两个问题和答案,但不能将它们完全应用于 n x m 数组:

Converting integer array to binary array in python

 a=clip_8bit #clip_8bit is a 100x100 unit8 array
 b=np.zeros_like(a)

for i in a:
    b[i]=bin(int(a[i]))[2:].zfill(8)

IndexError: index 109 is out of bounds for axis 0 with size 100
    

我尝试了矢量化和展平,但收到类型错误或大小为 1 的数组错误

vector = np.vectorize(np.int)
x=clip_8bit_int
x=vector(x)

y=np.zeros_like(x)
y=y.astype(int)
y=vector(y)

for i in y:
    y[i] = bin(i)[2:]  

TypeError: only integer scalar arrays can be converted to a scalar index

How do I convert an array of integers to binary?

这看起来正是我想要做的,但是由于我在应用第一个答案时遇到的问题,我不明白数组是如何表示的以及如何应用转换 - 我在这里不知道如何扩展此代码以迭代数组。我知道以下是错误的,但我一直在绕圈子。

int = clip_8bit  #clip_8bit is a 100x100 unit8 array

int maxLen = 0;
for (int i = 0; i < n; i++) {
    bin[i] = Integer.toBinaryString(arr[i]);
    maxLen = Math.max(maxLen, bin[i].length());
}
for (int i = 0; i < n; i++) {
    if (bin[i].length() != maxLen)
        bin[i] = String.format("%" + maxLen + "s", bin[i]).replace(' ', '0');
    System.out.println(bin[i]);
}

非常感谢,感谢您耐心解答显然是新手的问题!

****编辑****

I did get this working, but the answer below is much better

flat = clip_8bit.flatten()
n = flat.shape[0]
a = flat
b = np.array(np.zeros((n)))

for i in range(n):
    b[i]=bin(int(a[i]))[2:].zfill(8)

c = np.reshape(b, (100, 100), order = 'C')

【问题讨论】:

    标签: python arrays binary


    【解决方案1】:

    Numpy 有一个快速函数np.binary_repr(),它可以为单个数字执行您想要的操作。您可以使用np.vectorize() 将其应用于数组:

    import numpy as np
    
    l = np.arange(12).reshape([3, 4])
    # array([[ 0,  1,  2,  3],
    #        [ 4,  5,  6,  7],
    #        [ 8,  9, 10, 11]])
    
    np.vectorize(np.binary_repr)(l, 8)
    # array([['00000000', '00000001', '00000010', '00000011'],
    #        ['00000100', '00000101', '00000110', '00000111'],
    #        ['00001000', '00001001', '00001010', '00001011']], dtype='<U8')
    

    【讨论】:

    • 太棒了——谢谢!只是发布我要工作的内容,但您的答案显然更优雅
    猜你喜欢
    • 2016-03-03
    • 2022-01-07
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2013-05-28
    • 2016-04-22
    相关资源
    最近更新 更多