Python (0,1)-矩阵与(0,1)-向量的乘积

Python (0,1)-矩阵与(0,1)-向量的乘积,python,matrix,binary,Python,Matrix,Binary,在Python中,我想将一个二进制矩阵(每个元素为0或1)与一个二进制向量相乘。矩阵的大小大约为100000 x 100,向量有100个元素。如果V和x分别是矩阵和向量(初始化为bool),则以下简单代码可以完成这项工作: V.astype(np.int8).dot(x.astype(np.int8)) 我的问题是:有没有一种方法可以利用2个操作数的二进制特性更快地完成这项工作?毕竟,100000个操作中的每一个都是一行V和向量x之间的逻辑AND之和 谢谢你的帮助。 帕特里克 编辑:刚刚尝试了

在Python中,我想将一个二进制矩阵(每个元素为0或1)与一个二进制向量相乘。矩阵的大小大约为100000 x 100,向量有100个元素。如果V和x分别是矩阵和向量(初始化为bool),则以下简单代码可以完成这项工作:

V.astype(np.int8).dot(x.astype(np.int8))
我的问题是:有没有一种方法可以利用2个操作数的二进制特性更快地完成这项工作?毕竟,100000个操作中的每一个都是一行V和向量x之间的逻辑AND之和

谢谢你的帮助。 帕特里克


编辑:刚刚尝试了你的解决方案。奇怪的是,这两种方法(int8 et einsum)在我的机器上的性能似乎很相似

您可以使用:

结果是一样的:

In [29]: np.allclose(expected, result)
Out[29]: True
np.einsum
大约快3倍:

In [30]: %timeit np.einsum('ij,j->i', V, x)
100 loops, best of 3: 6.92 ms per loop
In [25]: %timeit V.astype(np.int8).dot(x.astype(np.int8))
10 loops, best of 3: 22.4 ms per loop
注意:与原始代码不同,在本例中,
np.einsum
返回一个dtype
int32
数组


您可以尝试使用
np.logical_和
np.sum
,但这样做要慢得多:

In [45]: result2 = np.logical_and(V, x).sum(axis=1)

In [46]: np.allclose(expected, result2)
Out[46]: True

In [47]: %timeit np.logical_and(V, x).sum(axis=1)
10 loops, best of 3: 78 ms per loop
这可能会比较慢,因为计算分两步进行
需要形成一个形状为(100000,100)的中间数组
np.logical_和(V,x)
。调用<代码> NP.EnSoMs/COD>让底层C++函数直接计算结果。

刚刚尝试UNUTBU解决方案。奇怪的是,这两种方法(int8 et einsum)在我的机器上的性能似乎相似。这是可能的。各种方法的性能(甚至相对性能)可能取决于NumPy的版本、编译NumPy时使用的库(请参见
np.show\u config()
)、操作系统、硬件等。
In [45]: result2 = np.logical_and(V, x).sum(axis=1)

In [46]: np.allclose(expected, result2)
Out[46]: True

In [47]: %timeit np.logical_and(V, x).sum(axis=1)
10 loops, best of 3: 78 ms per loop