我有一个矩阵 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
答案 0 :(得分:0)
dot
您无需完全展开矩阵即可对其进行按位“乘法”。您希望将A
视为4x8位矩阵,将x
视为8位元素位向量。对于A
和x
中的位,行乘法产生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
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])