python - (0,1) 矩阵与 (0,1) 向量相乘

标签 python matrix binary

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

V.astype(np.int8).dot(x.astype(np.int8))

我的问题是:有没有办法通过利用两个操作数的二进制性质来更快地完成它?毕竟,这 100000 次运算中的每一次都是 V 的一行与向量 x 之间的逻辑与之和。

感谢您的帮助。 帕特里克

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

最佳答案

您可以使用np.einsum :

In [12]: V = np.random.randint(2, size=(100000,100))
In [14]: x = np.random.randint(2, size=100)
In [15]: expected = V.astype(np.int8).dot(x.astype(np.int8))
In [28]: result = np.einsum('ij,j->i', V, x)

结果是一样的:

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.ological_andnp.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.logic_and(V, x)。调用 np.einsum 让底层 C++ 函数直接计算结果。

关于python - (0,1) 矩阵与 (0,1) 向量相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805873/

相关文章:

python - 如何找到依赖于python中特定模块的模块列表

python - 如何使用诱变剂打印 ID3 标签

java - java中解密加密的二进制文件(AES_CTR模式)

python - 如何向矩阵添加元素?

python - 错误 : NVCC compiler not in $path

c++ - 投影矩阵实现

linux - 我需要一个 Win/Linux 的二进制比较工具

python - 在 python 中绘制二进制数据

c - 已编译二进制文件中的预初始化函数指针?

c++ - C++ 中的变量矩阵名称