【问题标题】:Convolution only around nonzero values?仅围绕非零值进行卷积?
【发布时间】:2021-12-26 04:05:13
【问题描述】:

在任何 python 库中是否存在卷积,我只能围绕矩阵中的非零条目进行卷积?

对于卷积,我的意思是 scipy.ndimage.convolve - 但在这里我没有这个选项。

这是一个例子:

matrix = np.array([[ 0, 0, 0],
                   [ 0, 0, 0],
                   [ 0, 1, 1],
                   [ 0, 0, 0],
                   [ 0, 0, 0]])

kernel = np.array([[ 0, -1,  0],
                   [-1,  4, -1],
                   [ 0, -1,  0]])

我只想围绕矩阵中带有 1 的条目进行卷积 避免将算子应用于零区域以减少计算负担

【问题讨论】:

  • 我认为您可能需要通过围绕非零条目进行卷积来解释您的意思。
  • 我加个例子,现在清楚了吗?
  • 好吧,将您的运算符应用于矩阵映射块,这些块都是 0 到 0,并且仅在包含非零值的邻域中才有非零结果。因此,只需进行通常的卷积,您就可以在非零元素处或附近得到非零结果,对吧?您是否想避免将运算符应用于零区域以减少计算负担?也许您可以多说一下您的更大目标是什么。
  • 您是否希望避免将运算符应用于零区域以减少计算负担? --> 这正是我想做的事
  • 在尝试进行微优化之前,请提供具体证据证明您遇到了性能瓶颈:numpy 和 scipy 在他们的工作中非常出色,甚至可以卷积 100,000,000 cpu 上具有 3x3 内核的元素矩阵,在 5 年前非常适合计算,但今天已经过时了,几乎不需要任何时间。

标签: python convolution


【解决方案1】:

只需使用精美的索引分配将所有“这些应该保持为零”重置为零:

import numpy as np
from scipy.ndimage import convolve

matrix = np.array([[ 0, 0, 0],
                   [ 0, 0, 0],
                   [ 0, 1, 1],
                   [ 0, 0, 0],
                   [ 0, 0, 0]])

kernel = np.array([[ 0, -1,  0],
                   [-1,  4, -1],
                   [ 0, -1,  0]])

convolved = convolve(matrix, kernel)

"""
this will yield: array([[ 0,  0,  0],
                        [ 0, -1, -1],
                        [-1,  3,  2],
                        [ 0, -1, -1],
                        [ 0,  0,  0]])
"""

convolved[matrix == 0] = 0

"""
this is now: array([[0, 0, 0],
                    [0, 0, 0],
                    [0, 3, 2],
                    [0, 0, 0],
                    [0, 0, 0]])
"""

【讨论】:

  • 我想获得与 convolve(matrix, kernel) 相同的结果
  • 这在数学上是不可能的,所以你必须更好地解释你需要什么。卷积根据内核包含的元素数量对矩阵中的每个元素执行加权和计算。你不能“得到相同的结果”“忽略所有零”。如果你只是想“避免计算”,那么首先向自己证明你实际上是在浪费时间,因为 numpy 是高亮高效的,而你几乎肯定不是。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2018-05-12
  • 2015-06-21
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多