gpt4 book ai didi

python - 获取矩阵相邻元素的总和

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:04 25 4
gpt4 key购买 nike

我有一个矩阵例如。

[[4,5,0,0,0],
[5,1,2,1,0],
[0,2,3,2,0],
[0,1,2,1,0],
[0,0,0,0,0]]

对于矩阵中的每个元素,我试图获取其相邻对角线元素的总和及其相邻水平和垂直元素的总和。

以矩阵中间的3为例,我想计算对角线相邻元素(1)和水平和垂直相邻元素(2)的总和。对于角落和边缘情况,我想忽略没有元素的区域,例如。(对于左上角的 4,我想得到对角线相邻的 1 的总和以及水平和垂直相邻的总和5 个。

在 python 中执行此操作的最有效方法是什么?

到目前为止我想出了

diagonals = lambda x,y:[(x-1, y-1), (x-1,y+1), (x+1,y-1), (x+1,y+1)]
horiz_vert= lambda x,y:[(x,y+1), (x,y-1), (x+1,y), (x-1,y)]

获取索引,但这些没有考虑边缘和角落情况。

最佳答案

解决此任务的正确工具似乎是 convolution .您只需定义将应用于每个位置的过滤器(“对角线邻居之和”或“垂直/水平邻居之和”)即可。

import numpy as np
import scipy.signal

D = np.array([[4,5,0,0,0],
[5,1,2,1,0],
[0,2,3,2,0],
[0,1,2,1,0],
[0,0,0,0,0]])

h_diag = np.array([[1,0,1], [0,0,0], [1,0,1]])
h_hv = np.array([[0,1,0], [1,0,1], [0,1,0]])

过滤器的外观如下:

>>> h_diag
array([[1, 0, 1],
[0, 0, 0],
[1, 0, 1]])
>>> h_hv
array([[0, 1, 0],
[1, 0, 1],
[0, 1, 0]])

您可以将 2D 卷积视为在矩阵中移动滤波器并在每个位置计算逐元素乘法的总和。严格来说,过滤器需要镜像,但在您的情况下它们无论如何都是对称的。这是从网络上找到的原理的随机说明:

enter image description here

与您的情况唯一不同的是,我们希望将过滤器放置在任何地方,包括“边界”或“角落”位置。这可以通过对原始矩阵 D 进行零填充来实现,这样过滤器的中心就可以放置在例如在位置 (0,0)

好消息!它已经在 Numpy/Scipy 中实现,并且是一个非常有效的实现!现在,您只需将 D 与过滤器 h 进行卷积即可构建一个矩阵。

>>> scipy.signal.convolve2d(D, h_diag, mode='same')
array([[1, 7, 2, 2, 1],
[7, 7, 9, 3, 2],
[2, 9, 4, 4, 2],
[2, 3, 4, 3, 2],
[1, 2, 2, 2, 1]])

>>> scipy.signal.convolve2d(D, h_hv, mode='same')
array([[10, 5, 7, 1, 0],
[ 5, 14, 5, 4, 1],
[ 7, 5, 8, 5, 2],
[ 1, 4, 5, 4, 1],
[ 0, 1, 2, 1, 0]])

从这些矩阵中,您可以读出每个位置所需的总和。例如。原始矩阵 D 中的中心元素,即 D[2,2] 被对角线上的 4 个 1 和水平/垂直邻接处的 4 个 twos 包围。因此,(2,2) 位置的卷积输出中的条目是 48。位置 D[0,0] 只有一个对角邻居 (1) 和两个水平/垂直邻居 (55 )。卷积输出矩阵中的条目符合预期 110

关于python - 获取矩阵相邻元素的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48474308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com