ndarray矩阵点积的分段错误

时间:2014-06-30 11:38:59

标签: python numpy multidimensional-array svd

  • 我正在执行具有50000行和100列的矩阵的点积,并使用它进行转置。矩阵的值是浮点数。
A(50000, 100)

B(100, 50000)
  • 基本上我在较大的稀疏矩阵上执行SVD后得到矩阵。
  • 矩阵是numpy.ndarray类型。
  • 我使用numpy的点方法来乘以两个矩阵。我得到了分段错误。

    numpy.dot(A,B)

点积在30000行的矩阵上运行良好,但50000行失败。

  • numpy的点积是否有限制?
  • 使用点积时出现上述任何问题?
  • 是否还有其他优秀的python线性代数工具,它对大型矩阵有效。

1 个答案:

答案 0 :(得分:2)

正如您所知,存在内存问题。你想这样做:

numpy.dot(A, A.T)

结果需要大量内存(不是操作数)。然而,操作易于分片执行。您可以使用基于循环的方法一次生成一个输出行:

def trans_multi(A):
    rows = A.shape[0]
    result = numpy.empty((rows, rows), dtype=A.dtype)
    for r in range(rows):
        result[r,:] = numpy.dot(A, A[r,:].T)
    return result

因此,这只是一个较慢且同样耗费内存的版本(numpy.dot已经过优化)。但是,您最想要做的是将结果写入文件,因为您没有内存来保存结果:

def trans_multi(A, filename):
    with open(filename, "wb") as f:
        rows = A.shape[0]
        for r in range(rows):
            f.write(numpy.dot(A, A[r,:].T).tostring())

是的,它并不是完全闪电般的。但是,它很可能是你能想到的最快的。顺序写入通常是经过优化的。我试过了:

a=numpy.random.random((50000,100)).astype('float32')
trans_multi(a,"/tmp/large.dat")

大约需要60秒,但这实际上取决于您的硬盘性能。

为什么不记忆?

我喜欢mmapnumpy.memmap是件好事。但是,numpy.memmap已针对包含大表并从中计算小结果进行了优化。例如,memmap.dot针对memmapped数组的点积进行了优化。场景是操作数是memmapped,但结果是在RAM中。完全相反,就是这样。

当您进行随机访问时,Memmapping非常有用。这里的访问不是随机访问,而是顺序写入。此外,如果您尝试使用numpy.memmap创建一个(50000,50000)float32数组,则需要一些时间(由于某些原因我无法得到,即使没有必要也可能初始化数据)

但是,在创建文件之后,最好使用numpy.memmap来分析巨大的表,因为它提供了最佳的随机读取性能和非常方便的界面。