如何在numpy中进行卷积矩阵运算?

时间:2017-04-12 15:15:39

标签: python numpy

有没有办法使用numpy进行convolution matrix操作?

numpy.convolve仅对1D阵列进行操作,因此这不是解决方案。

我宁愿避免使用scipy,因为在Windows上安装它似乎更加困难。

3 个答案:

答案 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