我希望能够高效地计算矩阵乘积的一些特定值,既要考虑内存使用效率,也要考虑计算时间。但问题在于,中间矩阵具有两个非常大的维度,可能无法存储。
以下是示例值的维度:
以下是示例值的维度:
N = 7 # very large
K = 3
M = 10 # very large
L = 8 # very very large
'a'是一个形状为(N,K)的矩阵
'b'是一个形状为(K,N)的矩阵
a = np.arange(N*K).reshape(N,K)
b = np.arange(K*M).reshape(K,M)
rows是一个包含在范围(N)内且长度为L的索引数组
cols是一个包含在范围(M)内且长度为L的索引数组
rows = [0,0,1,2,3,3,4,6]
cols = [0,9,5,8,2,8,3,6]
我需要以下内容,但由于其大小无法计算中间结果为形状为(MxN)的矩阵(a @ b)
:
values = (a @ b)[rows, cols]
另一种实现方法可能涉及对a[rows]和b[:,cols]进行切片,创建形状为(L,K)和(K,L)的矩阵,但这些也太大了。 在进行高级切片时,Numpy会复制这些值。
values = np.einsum("ij,ji->i", a[rows], b[:,cols])
提前感谢您的帮助。
K、N、M、L
的实际数字(大致范围)? - Paul PanzerK=1e2, N=1e4, M=1e4, L=1e6
,但我希望我的算法能够处理十倍的因子K=1e3, N=1e5, M=1e5, L=1e7
。 - checkThisOut(a @ b)
,但是可以计算np.dot(a[np.unique(rows),:], b[:,np.unique(cols)])
吗?当然,这在很大程度上取决于您的rows
和cols
向量的性质。 - BenBoulderite