Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中为大型scipy.sparse矩阵操作分配内存_Python_Memory_Scipy_Ipython_Sparse Matrix - Fatal编程技术网

在python中为大型scipy.sparse矩阵操作分配内存

在python中为大型scipy.sparse矩阵操作分配内存,python,memory,scipy,ipython,sparse-matrix,Python,Memory,Scipy,Ipython,Sparse Matrix,有没有办法为scipy稀疏矩阵函数分配内存以处理大型数据集 具体地说,我正在尝试使用非对称最小二乘平滑(翻译成python和原始版本)对大型mass spec数据集(长度约60000)执行基线校正 函数(见下文)使用scipy.sparse矩阵运算 def baseline_als(y, lam, p, niter): L = len(y) D = sparse.csc_matrix(np.diff(np.eye(L), 2)) w = np.ones(L) for i in x

有没有办法为scipy稀疏矩阵函数分配内存以处理大型数据集

具体地说,我正在尝试使用非对称最小二乘平滑(翻译成python和原始版本)对大型mass spec数据集(长度约60000)执行基线校正

函数(见下文)使用scipy.sparse矩阵运算

def baseline_als(y, lam, p, niter):
  L = len(y)
  D = sparse.csc_matrix(np.diff(np.eye(L), 2))
  w = np.ones(L)
  for i in xrange(niter):
    W = sparse.spdiags(w, 0, L, L)
    Z = W + lam * D.dot(D.transpose())
    z = spsolve(Z, w*y)
    w = p * (y > z) + (1-p) * (y < z)
  return z
但是当传递较大的数据集时,例如

baseline_als(np.ones(50000), 100, 0.1, 10)
我收到了一封回忆录

  D = sparse.csc_matrix(np.diff(np.eye(L), 2))
试着改变

D = sparse.csc_matrix(np.diff(np.eye(L), 2))

D
将是
DIA
gonal格式的稀疏矩阵。如果结果表明CSC格式很重要,请使用
tocsc()
方法进行转换:

D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2).tocsc()
以下示例显示旧版本和新版本生成相同的矩阵:

In [67]: from scipy import sparse

In [68]: L = 8
原件:

In [69]: D = sparse.csc_matrix(np.diff(np.eye(L), 2))

In [70]: D.A
Out[70]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [-2.,  1.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.,  0.],
       [ 0.,  0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  1., -2.],
       [ 0.,  0.,  0.,  0.,  0.,  1.]])
新版本:

In [71]: diag = np.ones(L - 2)

In [72]: D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2)

In [73]: D.A
Out[73]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [-2.,  1.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.,  0.],
       [ 0.,  0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  1., -2.],
       [ 0.,  0.,  0.,  0.,  0.,  1.]])

不,您不能为numpy阵列分配内存。我怀疑您在
np.eye
np.diff
函数中遇到内存错误。两者都将产生
(L,L)
形状阵列-非常大的阵列。试试那些没有
sparse
调用的。@hpaulj你说得对。当np.diff函数传递给大型np.eye生成的数组时,错误就会出现:np.diff(np.eye(len(np.ones(50000)))我对python不熟悉。有人知道一种解决方法吗?通常当人们制作大型稀疏矩阵时,他们会尝试构造它们,而不首先制作等价的密集数组。在小的情况下,使用密集型是很方便的,但它会破坏使用稀疏型的许多优点。我也在python中实现了ALS,我发现使用solve_banded可以显著加快速度。如果你愿意,我也愿意分享我的实现。@perimosocordiae如果你能分享我的实现,我将不胜感激。我计划分析一组相当大的数据,速度上的任何提高都是有益的。
In [69]: D = sparse.csc_matrix(np.diff(np.eye(L), 2))

In [70]: D.A
Out[70]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [-2.,  1.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.,  0.],
       [ 0.,  0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  1., -2.],
       [ 0.,  0.,  0.,  0.,  0.,  1.]])
In [71]: diag = np.ones(L - 2)

In [72]: D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2)

In [73]: D.A
Out[73]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [-2.,  1.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.,  0.],
       [ 0.,  0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  1., -2.],
       [ 0.,  0.,  0.,  0.,  0.,  1.]])