我正在尝试找到计算两组向量之间的最小元素明智乘积的最佳方法。通常的矩阵乘法 C=A@B
将 Cij
计算为向量 Ai
和 元素的成对乘积之和B^Tj
。我想执行成对产品的最小值。我找不到使用 numpy 在两个矩阵之间执行此操作的有效方法。
实现此目的的一种方法是生成 A
和 B
之间的成对乘积的 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]]
最佳答案
使用broadcasting
将 A
扩展为 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/