我得到了一个矩阵 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位数组,我希望收到(半字节0110
)字节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])
1条答案
按热度按时间guicsvcw1#
1.未使用
dot
您不需要完全展开矩阵来执行比特“乘法”。您要将
A
视为4x 8的比特矩阵,将x
视为8元素的比特向量。如果A
和x
中的比特都为on,则列乘法会产生1,如果其中一个比特为0,则会产生0。这相当于套用比特和(&
):Here是一个关于计算字节中位数的帖子。
bin(n).count("1")
可能是最容易使用的,因此如果只需要一个数字,可以执行以下操作
2.使用
dot
要使用
dot
,可以很容易地将A
和x
扩展为它们的numpy等价物:您可以将
dot
套用至结果: