我试图将一些代码转换为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
我知道我可以将其重写为'因为'循环遍历像素,但有没有办法保持稀疏的数据结构,同时保持性能?
答案 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