【问题标题】:Python 3.x Finding saddle points in a matrixPython 3.x 在矩阵中查找鞍点
【发布时间】:2017-04-16 16:09:43
【问题描述】:

这是我的矩阵:

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。

鞍点的

坐标应该是:

2 0 
2 2
0 4

所以我的问题是。有人可以告诉我,如何用 Python 做这个吗? :)

【问题讨论】:

  • 查看尼克约翰逊的回答:stackoverflow.com/a/3062708/2063361
  • 谢谢我找到了这个话题。上面写着我应该找到所有行的最小值,所有列的最大值,看看它们中的任何一个是否在同一位置。但我不知道怎么做最后也是最重要的一步(检查位置)..
  • 为此您可以使用my_list.index(num)。它返回num 值在my_list 列表中的索引。
  • 尼克的回答如果不完整,如 cmets 所示。他的函数只会返回[(2, 0)]。

标签: python python-3.x matrix points saddle


【解决方案1】:

这是一种 Python 方法,它组装所有行/列的最小值和最大值的索引列表,然后使用集合操作来找到它们的交集:

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,4,第二行 2,0...
  • @JaroslavŠťastný 该函数将鞍点作为一组返回。一旦你有了它,你就可以用它做你想做的事情,包括对其进行排序或使用 for 循环逐行打印。
  • 我能知道为什么执行此步骤以获取鞍点的值“return (set(rowmins) & set(colmaxs)) | (set(rowmaxs) & set(colmins))” ?只是好奇,因为我对鞍点的了解很弱
【解决方案2】:

这是我在 python 中的鞍点查找器

import numpy as np


def is_saddle(row, column, *args):
    index = 0
    size = row * column
    matrix = np.arange(size).reshape(row, column)
    for i in range(row):
        for j in range(column):
            matrix[i][j] = args[0][index]
            index = index + 1
    print(matrix)
    for item_row in matrix:
        column_number = 0
        min_item = np.amin(item_row)
        for i in range(len(item_row)):
            if min_item == item_row[i]:
                row_number = i
                reversed_matrix = matrix.transpose()
                max_item = np.amax(reversed_matrix[row_number])
                if max_item == min_item:
                    print("saddle point found : {}".format(min_item))

    return matrix


row = input("enter row")
column = input("enter column")
matrix = input("enter the matrix items")
is_saddle(row, column, matrix)

输入样本:行 = 2,列 = 3,矩阵 = (1,2,3,4,5,6)

【讨论】:

    【解决方案3】:

    这是一种不同的制作方法。注意输入矩阵是np.ndarray:

    def saddles(mat : np.ndarray) -> list:
    
        """
        returns the list of all saddle points of the input matrix
    
        """
    
    
        (N, M) = mat.shape
    
        jMax = np.argmax(mat, axis = 1) # index of col for max in each row
        iMin = np.argmin(mat, axis = 0) # index of row for min in each col
    
        IJMax = [(i,jMax[i]) for i in range(N)] # list of indexes of max of each row
        IJMin = [(iMin[j],j) for j in range(M)] # list of indexes of min of each col
    
        maxRowMinCol = list(set(IJMax) & set(IJMin)) # max of row, min of col
    
    
        iMax = np.argmax(mat, axis = 0) # index of row for max in each col
        jMin = np.argmin(mat, axis = 1) # index of col for min in each row
    
        IJMax = [(iMax[j],j) for j in range(M)] # list of indexes of max of each col
        IJMin = [(i,jMin[i]) for i in range(N)] # list of indexes of min of each row
    
        minRowMaxCol = list(set(IJMax) & set(IJMin)) # min of row, max of col
    
    
        return maxRowMinCol + minRowMaxCol
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2015-09-08
      • 2022-11-02
      • 2016-05-02
      • 2017-08-20
      相关资源
      最近更新 更多