二进制矩阵乘法

时间:2017-05-26 14:10:25

标签: python numpy

我有一个矩阵 A ,其中以下字节为行:

11111110  (0xfe)
11111000  (0xf8)
10000100  (0x84)
10010010  (0x92)

我的程序使用函数sys.stdin.read(1)从stdin读取一个字节。假设我收到字节 x 10101010 (0xaa)。有没有办法使用numpy来执行乘法运算:

>>> A.dot(x)
0x06 (00000110)

由于A是一个4x8矩阵,由4个字节组成行,而x是一个8位数组,我期望收到(半字节0110)字节{{ 1}}作为乘法0000 0110的结果,将位作为矩阵的元素处理。

如果矩阵的元素被视为二进制字节,则结果为:

A * x

1 个答案:

答案 0 :(得分:0)

1。不使用dot

您无需完全展开矩阵即可对其进行按位“乘法”。您希望将A视为4x8位矩阵,将x视为8位元素位向量。对于Ax中的位,行乘法产生1,如果任一位为0,则为0。这相当于应用按位和(&):

>>> [hex(n) for n in (A & x)]
['0xaa', '0xa8', '0x80', '0x82']

10101010
10101000
10000000
10000000

Here是一个关于计算字节中位数的帖子。 bin(n).count("1")可能是最容易使用的,所以

>>> [bin(n).count("1") % 2 for n in (A & x)]
[0, 1, 1, 0]

如果您只想要一个号码,您可以执行类似

的操作
>>> int(''.join(str(bin(n).count("1") % 2) for n in (A & x)), 2)
6

2。使用dot

要使用dot,您可以轻松地将Ax扩展为他们的numpy等价物:

>>> list(list(int(n) for n in list(bin(r)[2:])) for r in A)
[['1', '1', '1', '1', '1', '1', '1', '0'],
 ['1', '1', '1', '1', '1', '0', '0', '0'],
 ['1', '0', '0', '0', '0', '1', '0', '0'],
 ['1', '0', '0', '1', '0', '0', '1', '0']]
>>> list(int(n) for n in bin(x)[2:])
[1, 0, 1, 0, 1, 0, 1, 0]

您可以将dot应用于结果:

>>> np.dot(list(list(int(n) for n in list(bin(r)[2:])) for r in A),
           list(int(n) for n in bin(x)[2:])) % 2
array([0, 1, 1, 0])