将数组中的每个元素转换为二进制 python
convert each element in array to binary python
我有一个 np 数组 (100,100 dtype=unit8),我想将每个元素转换为由 8 位表示的二进制。
我查看了下面的两个问题和答案,但不能完全将它们应用于 n x m 数组:
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
这看起来正是我想要做的,但是由于我在应用第一个答案时遇到的问题,我不完全理解数组是如何表示的以及转换是如何应用的 - 这里我我不确定如何扩展此代码以遍历数组。我知道以下是错误的,但我一直在兜圈子。
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')
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')
我有一个 np 数组 (100,100 dtype=unit8),我想将每个元素转换为由 8 位表示的二进制。
我查看了下面的两个问题和答案,但不能完全将它们应用于 n x m 数组:
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
这看起来正是我想要做的,但是由于我在应用第一个答案时遇到的问题,我不完全理解数组是如何表示的以及转换是如何应用的 - 这里我我不确定如何扩展此代码以遍历数组。我知道以下是错误的,但我一直在兜圈子。
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')
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')