【发布时间】:2018-06-23 01:02:44
【问题描述】:
我将 2 个矩阵相乘,A.dot(B),其中:
A = 1 x n 矩阵,dtype 浮点数
B = n x n 矩阵,dtype 布尔
我正在为较大的 n 执行此计算,并且内存很快耗尽(大约 n=14000 失败)。 A 和 B 是稠密的。
原因似乎是 numpy 在执行矩阵乘法之前将 B 转换为 dtype float,因此会产生巨大的内存成本。事实上,%timeit 表明它将 B 转换为浮点数比执行乘法所花费的时间更多。
有没有办法解决这个问题?这里的重点是减少内存尖峰/浮点转换,同时仍然允许通用矩阵功能(矩阵加法/乘法)。
以下是基准解决方案的可重复数据:
np.random.seed(999)
n = 30000
A = np.random.random(n)
B = np.where(np.random.random((n, n)) > 0.5, True, False)
【问题讨论】:
-
如果您在使用
dot之前将B转换为浮动,是否有任何区别,即A.dot(B.astype(float)是否显示相同的行为? -
内存和计算非常接近:
A.dot(B.astype(float)和A.dot(B)如果我事先将 B 转换为浮点数,计算时间会显着下降。我的目标是针对更大的 n(至少 n=30,000)执行此计算,因此内存改进至关重要,即使在具有更多内存的机器上也是如此。 -
你不能使用稀疏矩阵吗?
-
这仍然是关于 64 位的问题。老实说:用后者代替乘法+求和更有效。不确定这是否可以通过单独的索引来利用,但您可以使用 C 扩展来实现。
-
当数组变得非常大时,在较小的块上进行几次迭代可以节省时间。内存管理时间的节省超过了在迭代中花费的额外时间的补偿。
标签: python numpy matrix type-conversion sparse-matrix