我有一个二进制MxN矩阵,如下所示:
matrix([[0, 0, 0, ..., 0, 0, 0],
[0, 1, 0, ..., 0, 0, 0],
[0, 0, 1, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 1, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 1]])
如何将此矩阵逐行转换为整数表示?目标是获得Mx1矩阵。每行包含前一个二进制行的整数表示。
答案 0 :(得分:3)
另一种方法是使用numpy中的packbits。但是,为此,numpy将用列填充零,直到它们变为字节形状(length % 8
)。为了避免numpy填充0
,我们可以在开头添加零(不更改数组的二进制值)。
使用来自@Oliver W。
的数据>>> import numpy as np
>>> b = np.random.random_integers(0,1,(3,5))
>>> b
array([[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 1, 0, 0, 1]])
# Fill the begining with zeros to form bytes
>>> diff = 8 - b.shape[1] % 8
>>> if diff > 0: b = np.c_[np.zeros((b.shape[0], diff), int), b]
>>> b
array([[0, 0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 1, 0, 1, 0, 1],
[0, 0, 0, 0, 1, 0, 0, 1]])
# Get the integer number
>>> p = np.packbits(b, axis=1)
>>> p
array([[14],
[21],
[ 9]], dtype=uint8)
答案 1 :(得分:1)
你可以将行的每个元素乘以其相应的乘法因子2**exponent
,其中指数取决于行内数字的位置(顺便说一下,这适用于任何位置数系统,例如base- 60和十六进制):
>>> import numpy as np
>>>
>>> b = np.random.random_integers(0,1,(3,5)) # example array
>>> b
array([[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 1, 0, 0, 1]])
>>> c = 2**np.arange(b.shape[1])[::-1] # reverse order: assumes the last column corresponds with the decimal number 1
>>> b.dot(c) # matrix multiplication
array([14, 21, 9])
如果你有numpy的矩阵类实例,那么结果相同。
答案 2 :(得分:0)
你可以将每一行的所有0和1连接成字符串,从那里很容易得到整数表示。我必须将matrix
转换为array
才能使其生效,但也许有一个直接的解决方案:
import numpy as np
A = np.matrix([[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 1, 0, 0, 1]])
B = np.asarray(A)
#join all 0/1s together as string and convert to integer
C = np.matrix([int(''.join(str(x) for x in column),2) for column in B]).reshape((B.shape[0],1))
print C
>>>
[[14]
[21]
[ 9]]