二进制矩阵乘法

2024-09-29 23:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个矩阵a,以下字节作为行:

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

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

^{pr2}$

由于A是一个4x8矩阵,由4个字节组成行,而x是一个8位数组,所以我期望接收(半字节{})字节0000 0110,这是乘法的结果A * x,将位视为矩阵的元素。在

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

>>> 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])

Tags: 方法函数程序numpyread字节npstdin
1条回答
网友
1楼 · 发布于 2024-09-29 23:29:58

1。不使用dot

你不需要完全展开你的矩阵来进行按位“乘法”。您希望将A视为4x8位矩阵,x视为8元位向量。行乘法对于Ax中均为on的位生成1,如果其中任何一位为0,则为0。这相当于应用按位and(&):

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

^{pr2}$

Here是对字节中的位进行计数的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和{}扩展为它们的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])

相关问题 更多 >

    热门问题