【问题标题】:Sum of the cells around a single cell in a matrix with python使用python的矩阵中单个单元格周围的单元格总和
【发布时间】:2018-03-10 00:21:10
【问题描述】:

我有两个矩阵:在“matrix”中有 0 和 1。在“matrix_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 单元格的总和。 有这个功能吗?因为可以肯定我的代码写得不好,而且会很长。谢谢。

【问题讨论】:

  • 您说您也想计算 10x10 单元格的总和,但这难道仅对奇数内核大小有意义吗?否则你会得到一个不对称的内核
  • @MaartenFabré 抱歉,我为未来的读者编辑

标签: python matrix sum


【解决方案1】:

使用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]])

纯蟒蛇

这与 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]])

原生蟒蛇

在内循环中添加2行:

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

【讨论】:

  • 这会产生我在阅读 OP 的描述后所期望的输出。我认为需要澄清一下,为什么他的预期输出 matrix2 不同
  • @MrT。 OP 的matrix2 代码仅给出原始矩阵中存在点的值。如果这是他想要的,这个也可以添加
【解决方案2】:

如果我错了,请纠正我 细胞 matrix[r][c] 我们正在添加以下值

r-1,c-1
r-1,c
r-1,c+1
r,c-1
r,c
r,c+1
r+1,c-1
r+1,c
r+1,c+1

我写了以下代码,请检查。

def get_sum_of_cells_around(matrix,num_rows,num_cols):

    def valid(r,c):
        if r<0 or r>=num_rows or c<0 or c>=num_cols:
            return False
        return True


    result = []
    for r in range(0,num_rows):
        row = []
        for c in range(0,num_cols):
            value = 0
            for i in range(-1,2):
                for j in range(-1,2):
                    if valid(r+i,c+j):
                       value+=matrix[r+i][c+j]
            row.append(value)
        result.append(row)
    return result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多