二进制矩阵到整数

时间:2015-03-30 09:07:59

标签: numpy matrix representation

我有一个二进制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矩阵。每行包含前一个二进制行的整数表示。

3 个答案:

答案 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]]