2016-12-01 8 views
0

Это моя матрица:Python 3.x Нахождение седловых точек в матрице

1 1 2 5 6 1  
5 6 8 5 6 7 
10 12 10 12 11 11 
8 10 5 6 8 9 
6 5 10 12 15 19 

, и я хотел бы найти это saddle points.

КООРДИНАТЫ из Saddle точек должно быть:

2 0 
2 2 
0 4 

Так что мой вопрос. Может кто-нибудь покажет мне, как это сделать на Python? :)

+1

Возможный дубликат [вопрос о седловой точке] (http://stackoverflow.com/questions/3062161/question-about-saddle-point) –

+0

Проверьте ответ Ника Джонсона: http://stackoverflow.com/a/3062708/2063361 –

+0

Спасибо Я нашел эту тему. Там написано, что я должен найти наименьшие значения всех строк, наибольшие значения всех столбцов и посмотреть, находятся ли они в одной позиции. Но я не знаю, как сделать последний и самый важный шаг (проверьте позицию). –

ответ

1

Вот Python подход, который собирает списки индексов всех строк минут/столбцов и Maxs, а затем использует набор операций, чтобы найти их пересечения:

def allSaddles(matrix): 
    rowmins = [] 
    rowmaxs = [] 
    colmins = [] 
    colmaxs = [] 

    for i,row in enumerate(matrix): 
     m = min(row) 
     M = max(row) 
     for j,x in enumerate(row): 
      if x == m: rowmins.append((i,j)) 
      if x == M: rowmaxs.append((i,j)) 

    t = [list(column) for column in zip(*matrix)] #transpose of matrix 

    for j,col in enumerate(t): 
     m = min(col) 
     M = max(col) 
     for i,x in enumerate(col): 
      if x == m: colmins.append((i,j)) 
      if x == M: colmaxs.append((i,j)) 

    return (set(rowmins) & set(colmaxs)) | (set(rowmaxs) & set(colmins)) 

M = [[1,1,2,5,6,1],  
[5,6,8,5,6,7], 
[10,12,10,12,11,11], 
[8,10,5,6,8,9], 
[6,5,10,12,15,19]] 

print(allSaddles(M)) 

Выход: {(0, 4), (2, 0), (2, 2)}

+0

Я очень ценю вашу помощь. У меня есть еще один вопрос. Может ли он печатать координаты на новых строках? например 0,4 на первой линии, 2,0 на второй линии ... –

+0

@ JaroslavŠťastný Функция возвращает седловые точки в виде набора. Как только вы это сделаете, вы можете делать с ним то, что хотите, включая его сортировку или использование цикла for для его печати по строкам. –

+0

О, это правда, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^