python - 计算略有不同的矩阵乘法

标签 python numpy scipy sparse-matrix

我正在尝试找到计算两组向量之间的最小元素明智乘积的最佳方法。通常的矩阵乘法 C=A@BCij 计算为向量 Ai 元素的成对乘积之和B^Tj。我想执行成对产品的最小值。我找不到使用 numpy 在两个矩阵之间执行此操作的有效方法。

实现此目的的一种方法是生成 AB 之间的成对乘积的 3D 矩阵(在求和之前),然后取第三个中的最小值方面。但这会导致巨大的内存占用(而且我实际上不知道如何做到这一点)。

你知道我如何实现这个操作吗?

示例:

A = [[1,1],[1,1]]
B = [[0,2],[2,1]]

矩阵相乘:

C = [[1*0+1*2,1*2+1*1][1*0+1*2,1*2+1*1]] = [[2,3 ],[2,3]]

最小矩阵相乘:

C = [[分钟(1*0,1*2),分钟(1*2,1*1)][分钟(1*0,1*2),分钟(1*2, 1*1)]] = [[0,1],[0,1]]

最佳答案

使用broadcastingA 扩展为 3D 后 -

A = np.asarray(A)
B = np.asarray(B)
C_out = np.min(A[:,None]*B,axis=2)

如果您关心内存占用,请使用 numexpr module提高效率 -

import numexpr as ne

C_out = ne.evaluate('min(A3D*B,2)',{'A3D':A[:,None]})

大型数组的计时 -

In [12]: A = np.random.rand(200,200)

In [13]: B = np.random.rand(200,200)

In [14]: %timeit np.min(A[:,None]*B,axis=2)
34.4 ms ± 614 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [15]: %timeit ne.evaluate('min(A3D*B,2)',{'A3D':A[:,None]})
29.3 ms ± 316 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [16]: A = np.random.rand(300,300)

In [17]: B = np.random.rand(300,300)

In [18]: %timeit np.min(A[:,None]*B,axis=2)
113 ms ± 2.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [19]: %timeit ne.evaluate('min(A3D*B,2)',{'A3D':A[:,None]})
102 ms ± 691 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

所以,numexpr 有一些改进,但可能没有我预期的那么多。

关于python - 计算略有不同的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458980/

相关文章:

python - 比较 itemgetter 对象

python - Python 中的默认参数和 SQL 查询 - 习语/模式?

python - 如何使用Python区分信号的下降沿?

python - 矩阵线性组合的系数

python - 计算 numpy 数组中符号的持久性

python - 如何从其他信号发送django信号

python - 试图让一个函数返回最长的字符串

python - numpy 的逆 cumsum

python - 如何为元组的每个元素添加一个数字?

python - 如何使用 KDTree.query_ball_tree 在 x,y 网格中查找点集