Чистый способ вернуть средний индекс матрицы в Python - PullRequest
0 голосов
/ 08 января 2019

Требуется чистый способ найти индекс середины матрицы, а если нет «середины», то индекс максимального элемента, окружающего. Матрицы примечаний не всегда квадратные.

Пример 1. Ввод: [[1,2],[3,4]]

(1,2)
(3,4)

Так что это вернет (1,1), потому что максимальный элемент, окружающий «середину», равен 4.

Пример 2. Ввод: [[1,2,3],[4,5,6],[7,8,9]]

(1,2,3)
(4,5,6)
(7,8,9)

И это вернет (1,1), потому что это индекс середины матрицы.

Был бы признателен за чистый способ вернуть указанный индекс!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В прямом Python:

def mid(n): return {(n-1)//2,n//2}
max(((i,j) for i in mid(len(a)) for j in mid(len(a[0]))),
    key=lambda ij: a[ij[0]][ij[1]])
0 голосов
/ 08 января 2019

Пусть ваша матрица будет массивом NumPy.

import mumpy as np
a = np.array([[1,2], [3,4]])
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
c = np.random.random_integers(100, size=8).reshape(2, -1)
#array([[41, 61, 47, 51],
#       [40, 81, 23, 66]])

Проверьте размеры, извлеките «центр», найдите максимальное значение и его координаты, настройте их:

def find_center(a):
    x = (a.shape[0] // 2 if a.shape[0] % 2 else a.shape[0] // 2 - 1, 
         a.shape[0] // 2 + 1)
    y = (a.shape[1] // 2 if a.shape[1] % 2 else a.shape[1] // 2 - 1, 
         a.shape[1] // 2 + 1)
    center = a[x[0]:x[1], y[0]:y[1]]
    argmax = np.unravel_index(center.argmax(), center.shape)
    return argmax[0] + x[0], argmax[1] + y[0] # Adjust 

Тестирование:

find_center(a)
#(1, 1)
find_center(b)
#(1, 1)
find_center(c)
#(1, 1) - 81!
...