【发布时间】:2018-11-18 08:23:48
【问题描述】:
我想以一种在内存使用和计算时间上有效的方式计算矩阵乘积的某些值。问题是中间矩阵有两个非常大的维度,可能无法存储。
带有示例值的维度:
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 是一个索引数组,其值在 range(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的实际数字(大概)? -
[rows, cols] aprrox 有多大。相对于整个输出?只有几个值,5%,50% ?
-
目前我有
K=1e2, N=1e4, M=1e4, L=1e6但我希望我的算法能够处理因子 10K=1e3, N=1e5, M=1e5, L=1e7 -
无法计算
(a @ b),但可以计算np.dot(a[np.unique(rows),:], b[:,np.unique(cols)])吗?当然,这很大程度上取决于rows和cols向量的性质。 -
我已经删除了没有值的每一行和每一列,所以在这种情况下唯一没有帮助
标签: python numpy scipy sparse-matrix matrix-multiplication