gpt4 book ai didi

python - 用python计算矩阵中单个单元格周围的单元格总和

转载 作者:行者123 更新时间:2023-11-28 17:08:43 25 4
gpt4 key购买 nike

我有两个矩阵:在“矩阵”中有 0 和 1。在“矩阵_2”中我想对单个单元格周围的单元格求和。例如:

matrix =
[[0 0 0 0 0 1 1 0 0 0]
[0 0 0 0 0 1 1 0 0 0]
[1 1 1 0 1 1 0 1 0 0]
[0 0 1 1 1 1 0 1 0 0]
[0 0 1 1 1 1 1 0 0 0]
[0 0 0 0 1 0 0 0 0 0]]

matrix_2 =
[[0 0 0 0 0 4 4 0 0 0]
[0 0 0 0 0 6 6 0 0 0]
[2 4 4 0 6 6 0 3 0 0]
[0 0 6 8 8 7 0 3 0 0]
[0 0 4 7 7 6 4 0 0 0]
[0 0 0 0 4 0 0 0 0 0]]

在这种情况下,matrix_2 计算单元格和紧邻单元格的总和。

matrix_2 = np.zeros((y_segment, x_segment), dtype=int)
for y_matrix in xrange(0, y_segment, 1):
for x_matrix in xrange(0, x_segment, 1):
if matrix[y_matrix][x_matrix] != 0:
if 0 < x_matrix < x_segment - 1 and 0 < y_matrix < y_segment - 1:
# print "y_matrix: " + str(y_matrix) + ", x_matrix: " + str(x_matrix)
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix-1][x_matrix] + \
matrix[y_matrix-1][x_matrix-1] + matrix[y_matrix-1][x_matrix+1] + \
matrix[y_matrix+1][x_matrix-1] + matrix[y_matrix+1][x_matrix] + \
matrix[y_matrix+1][x_matrix+1] + matrix[y_matrix][x_matrix-1] + \
matrix[y_matrix][x_matrix+1]
if x_matrix == 0 and y_matrix == 0: # 1
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix][x_matrix+1] + \
matrix[y_matrix+1][x_matrix+1] + matrix[y_matrix+1][x_matrix]
if x_matrix == 0 and y_matrix == y_segment-1: # 10
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix - 1][x_matrix] + \
matrix[y_matrix - 1][x_matrix + 1] + matrix[y_matrix][x_matrix + 1]
if x_matrix == x_segment-1 and y_matrix == y_segment-1: # 12
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix - 1][x_matrix] + \
matrix[y_matrix][x_matrix - 1] + matrix[y_matrix - 1][x_matrix - 1]
if x_matrix == x_segment-1 and y_matrix == 0: # 3
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix][x_matrix-1] + \
matrix[y_matrix + 1][x_matrix - 1] + matrix[y_matrix + 1][x_matrix]
if x_matrix == 0 and y_matrix != 0 and y_matrix != y_segment-1:
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix-1][x_matrix] + \
matrix[y_matrix-1][x_matrix+1] + matrix[y_matrix+1][x_matrix] + \
matrix[y_matrix+1][x_matrix+1] + matrix[y_matrix][x_matrix+1]
if x_matrix == x_segment-1 and y_matrix != 0 and y_matrix != y_segment-1:
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix - 1][x_matrix] + \
matrix[y_matrix - 1][x_matrix - 1] + matrix[y_matrix + 1][x_matrix] + \
matrix[y_matrix + 1][x_matrix - 1] + matrix[y_matrix][x_matrix - 1]
if y_matrix == 0 and x_matrix != 0 and x_matrix != x_segment-1:
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix][x_matrix + 1] + \
matrix[y_matrix][x_matrix - 1] + matrix[y_matrix + 1][x_matrix] + \
matrix[y_matrix + 1][x_matrix + 1] + matrix[y_matrix + 1][x_matrix - 1]
if y_matrix == y_segment-1 and x_matrix != 0 and x_matrix != x_segment-1:
matrix_2[y_matrix][x_matrix] = matrix[y_matrix][x_matrix] + matrix[y_matrix][x_matrix + 1] + \
matrix[y_matrix][x_matrix - 1] + matrix[y_matrix - 1][x_matrix] + \
matrix[y_matrix - 1][x_matrix + 1] + matrix[y_matrix - 1][x_matrix - 1]

但我想计算单元格周围 9x9 单元格的总和。有那个功能吗?因为肯定我的代码写得不好,而且会很长。谢谢。

最佳答案

使用 convolution

内核

size=3
kernel = np.ones((size,size))
array([[ 1.,  1.,  1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])

计算

result = signal.convolve(matrix, kernel, method='direct').astype(int)
array([[0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 2, 4, 4, 2, 0, 0, 0],
[1, 2, 3, 2, 2, 4, 6, 6, 3, 1, 0, 0],
[1, 2, 4, 4, 5, 6, 6, 6, 3, 2, 0, 0],
[1, 2, 5, 6, 8, 8, 7, 6, 3, 2, 0, 0],
[0, 0, 2, 4, 7, 7, 6, 4, 2, 1, 0, 0],
[0, 0, 1, 2, 4, 4, 4, 2, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]])

修剪

这也增加了外层,所以你需要修剪它们

result_trimmed = result[(size-1)//2:-(size-1)//2,(size-1)//2:-(size-1)//2]
array([[0, 0, 0, 0, 2, 4, 4, 2, 0, 0],
[2, 3, 2, 2, 4, 6, 6, 3, 1, 0],
[2, 4, 4, 5, 6, 6, 6, 3, 2, 0],
[2, 5, 6, 8, 8, 7, 6, 3, 2, 0],
[0, 2, 4, 7, 7, 6, 4, 2, 1, 0],
[0, 1, 2, 4, 4, 4, 2, 1, 0, 0]])

纯 python

这与 scipy 替代方案相同

from itertools import product
def convolution(matrix, size):
if size % 2 != 1:
ValueError('`size` must be an odd integer')
h, w = (len(matrix), max(len(row) for row in matrix), )
# print(w, h)
result = [[0] * w for _ in range(h)]
for x, y in product(range(w), range(h)):
# print(x, y)
y_min, y_max = max(0, y - size // 2), min(h, y + size // 2 + 1)
x_min, x_max = max(0, x - size // 2), min(w, x + size // 2 + 1)
# print(matrix[y][x], x_min, x_max, y_min, y_max)
rows = matrix[y_min: y_max]
result[y][x] = sum(sum(row[x_min: x_max]) for row in rows)
return result

OP 的 matrix2

如果这是 OP 期望的结果,则可以通过以下方式实现

numpy 方法:

假设matrix是初始矩阵的np.array形式

np.where(matrix != 0, result_trimmed, 0)
array([[0, 0, 0, 0, 0, 4, 4, 0, 0, 0],
[0, 0, 0, 0, 0, 6, 6, 0, 0, 0],
[2, 4, 4, 0, 6, 6, 0, 3, 0, 0],
[0, 0, 6, 8, 8, 7, 0, 3, 0, 0],
[0, 0, 4, 7, 7, 6, 4, 0, 0, 0],
[0, 0, 0, 0, 4, 0, 0, 0, 0, 0]])

原生python

在内部循环中添加 2 行:

...
for x, y in product(range(w), range(h)):
if matrix[y][x] == 0:
continue
...

关于python - 用python计算矩阵中单个单元格周围的单元格总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49194152/

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