为稀疏对角线系统设计SciPy卷积

时间:2014-05-03 01:13:22

标签: python scipy sparse-matrix

我试图将一些代码转换为Python,但我注意到SciPy的稀疏对角操作在处理对角线系统时遇到了一些问题。

例如,下面的代码可以写成每像素卷积,这在我的C ++实现中非常快。对于重叠,它大约是内存访问时间。我希望Python知道这一点,因为系统是对角的。

当我尝试在Python中运行它时,我的终端占用了系统资源并几乎杀死了我的系统。例如,Matlab版本的速度要快得多。

import numpy as np
from scipy import sparse
print(np.version.version)
color=imread('lena.png')
gray=mean(color,2)
[h,w]=gray.shape
img=gray.flatten()
ne=h*w;
L=np.ones(ne);
M=.5*np.ones(ne);
R=np.ones(ne);
Diags=[L,M,R]
mtx = sparse.spdiags(Diags, [-1,0,1], ne, ne);
#blured=np.dot(mtx,img) Dies

我知道我可以将其重写为'因为'循环遍历像素,但有没有办法保持稀疏的数据结构,同时保持性能?

1 个答案:

答案 0 :(得分:1)

使用mtx.dot代替np.dot作为

blured = mtx.dot(img)

或只是

blured = mtx * img # where mtx is sparse and img is `dense` or `sparse` 

np.dot的两个参数由dense处理,即使其中一个是sparse。 因此,这会引发MemoryError