【问题标题】:How to get nearest r elements in mxn matrix, for each element对于每个元素,如何在 mxn 矩阵中获取最近的 r 元素
【发布时间】:2020-06-08 16:13:05
【问题描述】:

我有一个名为arrmxn 矩阵。对于arr 中的每个元素,我想查看该元素的 r 个单位(包括对角线)内的所有元素(即子矩阵)。例如如果 r=1,则子矩阵应该是围绕当前像素的 3x3 正方形。子矩阵不一定必须是正方形(例如,如果所讨论的元素位于矩阵的边缘,则不需要)。

我尝试了以下方法,但成功有限:

r=1
for i in range(m):
    for j in range(n): 
        print(arr[max(0,i-r-1):min(i+r+1,m), max(0,j-r-1):min(j+r+1,n)])

【问题讨论】:

  • 当它靠近边缘时,您希望它显示什么?您的切片大小可能超过数组大小
  • @DouglasFerreira 刚刚更新以包含该内容。它仍然应该显示一个子矩阵,只是不是正方形。

标签: python numpy opencv


【解决方案1】:
r = 1
for i in range(m):
    for j in range(n):
        start_y = i-r
        end_y = i+ r + 1

        start_x = j - r
        end_x = j + r + 1

        if start_y < 0:
            start_y = 0

        elif end_y >= m:
            end_y = m

        if start_x < 0:
            start_x = 0

        elif end_x >= n:
            end_x = n

        print(arr[start_y: end_y, start_x: end_x])

【讨论】:

  • 在嵌套for循环的前4行中应该是i而不是mj而不是n
  • 似乎并不完全。第一次迭代 (i,j=0) 生成一个 1x1 子矩阵(元素本身)。
  • 是的,我认为您的解决方案与我上面的原始解决方案相似(如果不相同)。 Python 的切片很烦人……
  • 我相信如果我们更改为end_y = i+ r + 1end_x = j + r + 1,问题就会得到解决。即如果我们加 1。我不确定是否也需要从 start_y 和 start_x 加 -1,但它似乎没有。
  • 我在上次编辑中添加了它。是的,开始索引中不需要-1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2012-08-27
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多