有没有办法使用numpy进行convolution matrix操作?
numpy.convolve
仅对1D阵列进行操作,因此这不是解决方案。
我宁愿避免使用scipy,因为在Windows上安装它似乎更加困难。
答案 0 :(得分:5)
你有scipy的ndimage,它允许你用convolve执行N维卷积:
public class RetryableFuture implements Future {
//Implement other methods.
@Override
public Object get() throws InterruptedException, ExecutionException {
try{
//get operation on future object
}catch(ExecutionException e){
if(e.getCause() instanceof RetryableHazelcastException){
//Log some warnings and submit the task back to Executors
}
}catch(Exception e){
//Not all exceptions are retryable
}finally {
//Close any kind of resources.
}
}
}
我知道你说你想避免scipy ......但我会反对它。 Scipy在很多方面都很棒。如果您想在Windows上安装它,请尝试安装了scipy的Anaconda Distribution。
Anaconda是一个多平台python发行版,它预装了所有必需的库(包括许多科学计算库),以及from scipy.ndimage import convolve
convolve(data, kernel)
或pip
等工具来安装新的。不,他们不会付钱给我做广告:/但是让您的多平台生活变得更加轻松。
答案 1 :(得分:3)
我强烈建议您使用openCV来达到此目的。但是原则上你几乎可以直接使用"伪代码"在wiki-article on kernel convolution上创建自己的函数......
ks = (kl-1)/2 ## kernels usually square with odd number of rows/columns
kl = len(kernel)
imx = len(matrix)
imy = len(matrix[0])
for i in range(imx):
for j in range(imy):
acc = 0
for ki in range(kl): ##kernel is the matrix to be used
for kj in range(kl):
if 0 <= i-ks <= kl: ## make sure you don't get out of bound error
acc = acc + (matrix[i-ks+ki][j-ks+kj] * kernel[ki][kj])
matrix[i][j] = acc
这原则上应该做的伎俩(但我还没有测试过......)
我希望这有用。
答案 2 :(得分:0)
使用矩阵添加而不是单元格执行的另一种numpy方法可以减少循环。
def zConv(m,K):
#input assumed to be numpy arrays Kr<=mrow, Kc<=mcol, Kernal odd
#edges wrap Top/Bottom, Left/Right
#Zero Pad m by kr,kc if no wrap desired
mc=m*0
Kr,Kc= K.shape
kr=Kr//2 #kernel center
kc=Kc//2
for dr in range(-kr,kr+1):
mr=np.roll(m,dr,axis=0)
for dc in range(-kc,kc+1):
mrc=np.roll(mr,dc,axis=1)
mc=mc+K[dr+kr,dc+kc]*mrc
return mc