Python 二元矩阵乘法

Python 二元矩阵乘法,python,numpy,Python,Numpy,我得到了一个矩阵a,以下字节作为行: 11111110 (0xfe) 11111000 (0xf8) 10000100 (0x84) 10010010 (0x92) 我的程序使用函数sys.stdin.read(1)从stdin读取一个字节。假设我收到字节x10101010(0xaa)。是否有一种使用numpy执行乘法的方法: >>> A.dot(x) 0x06 (00000110) 由于A是一个4x8矩阵,由4个字节作为行组成,x是一个8位数组,我希望通过乘法A*

我得到了一个矩阵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位数组,我希望通过乘法
A*x
将位作为矩阵的元素来接收(半字节
0110
)字节
0000 0110

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

>>> A = np.array([[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]])
>>> x = np.array([1,0,1,0,1,0,1,0])
>>> A.dot(x)%2
array([0, 1, 1, 0])
1.不使用
dot
不需要完全展开矩阵就可以对其进行逐位“乘法”。您希望将
A
视为4x8位矩阵,将
x
视为8元素位向量。行乘法为
A
x
中开启的位生成1,如果任一位为0,则生成0。这相当于应用位and(
&
):

是对字节中的位进行计数的post
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
,您可以轻松地将
A
x
展开为它们的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])

您希望如何获得0x06?请你带我看一下你的问题中的手动步骤好吗?请补充你的问题。阅读您的问题的人不可能理解这一点。请完成问题中的实际步骤。如果A是4x8,则单个位是矩阵元素吗?半字节是矩阵元素(在这种情况下,A是4x2)?“你到底是怎么做到的?”MadPhysician。是的,我想把比特当作矩阵的元素。我想知道使用
numpy
是否可以做到这一点。感谢您的回答,不使用
dot
似乎是更好的解决方案。它确实更短,并且需要更少的字符串转换。
>>> 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]
>>> 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])