Python - Как найти максимальное число по сравнению со всеми соседями - PullRequest
1 голос
/ 18 января 2020

У меня проблема с кодом Python.

  • Вход (M) = двумерный массив с целыми числами
  • Выход (T) того же двумерного массива, но с 0 и 1.
  • Ti, j = 1, если все соседи целого числа Mi, j (в 8 возможных направлениях) СТРОГО меньше, чем Mi, j.
  • В противном случае, в противоположном случае, Ti, j = 0, если хотя бы один сосед в матрице M больше или равен Mij.

Я пытаюсь с этим кодом, но он не возвращает правильный T.

def findmaximun(M):
    # Write your code here
    r, c = len(M),len(M[0])
    T = [[1 for col in range(c)] for row in range(r)]
    for i in range(0,r):
        for j in range(0,c): 
            for k in [-1,0,1]:
                if i+k>=0 and i+k<r:
                    for l in [-1,0,1]:
                        if j+l>=0 and j+l<c and max(-i-k,0)!=max(-j-l,0):
                            if M[i][j] <= M[i+k][j+l]:
                                      T[i][j]=0                
    return(T)

Ответы [ 2 ]

0 голосов
/ 18 января 2020

мое решение очень явное. Я уверен, что есть более элегантный способ обработки крайних случаев, но он может быть не таким читабельным. В идеале можно использовать numpy для такой задачи. Это намного быстрее и предлагает лучшую индексацию и операции с массивами. Также вместо того, чтобы вводить idx явно, можно использовать itertools.

Я проверил код с помощью matplotlibs imshow

import random

r = 10
c = 15

M = []
for i in range(r):
    M.append([])
    for j in range(c):
        M[i].append(random.random())


def find_max(M):
    # Setup array dimensions and output array
    r, c = len(M), len(M[0])
    T = [[0 for col in range(c)] for row in range(r)]
    # iterate over array
    for i, row in enumerate(M):
        for j, elem in enumerate(row):
            # handle edge cases (literally!)
            if i == 0:
                if j==0:
                    idx = [(1,0), (1,1), (0,1)]
                elif j==c-1:
                    idx = [(1,0), (1,-1), (0,-1)]
                else:
                    idx = [(1,0), (1,1), (0,1), (1,-1), (0,-1)]
            elif i==r-1:
                if j==0:
                    idx = [(-1,0), (-1,1), (0,1)]
                elif j==c-1:
                    idx = [(-1,0), (-1,-1), (0,-1)]
                else:
                    idx = [(-1,0), (-1,1), (0,1), (-1,-1), (0,-1)]
            else:
                if j==0:
                    idx = [(-1,0), (-1,1), (0,1), (1,1), (1,0)]
                elif j==c-1:
                    idx = [(-1,0), (-1,-1), (0,-1), (1,-1), (1,0)]
                else:
                    idx = [(0,1), (1,1), (1,0), (1,-1), (0,-1), (-1,-1), (-1,0), (-1,1)]
            # get the neighbors
            neighbors = []
            for x, y in idx:
                neighbors.append(M[i + x][j + y])
            # calculate t    
            if elem > max(neighbors):
                T[i][j] = 1
    return T
T = find_max(M)

0 голосов
/ 18 января 2020
def findmaximun(M):
    # Write your code here
    r, c = len(M), len(M[0])
    T = [[1 for col in range(c)] for row in range(r)]

    #  all neighbors
    ds = [(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1)]

    for i in range(0, r):
        for j in range(0, c):
            for dx, dy in ds:
                x = i + dx
                y = j + dy
                if (0 <= x < r and 0 <= y < c and M[x][y] >= M[i][j]):
                    T[i][j] = 0
                    break

    return (T)
...