在Python中返回矩阵中间索引的干净方法

Posted

技术标签:

【中文标题】在Python中返回矩阵中间索引的干净方法【英文标题】:Clean way of returning middle index of matrix in Python 【发布时间】:2019-01-08 02:34:36 【问题描述】:

想要一种干净的方法来找到矩阵中间的索引,如果没有“中间”,那么就是周围最大元素的索引。音符矩阵并不总是方形的。

例如 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),因为这是矩阵中间的索引。

希望有一种干净的方式返回所述索引!

【问题讨论】:

定义“干净”。 没有一百行代码是一个初学者。 这些矩阵总是方的吗? 不,他们不是。 您尝试过什么吗?获取“中间”的索引应该很容易。 【参考方案1】:

让你的矩阵是一个 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!

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在Python中返回矩阵中间索引的干净方法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode74. 搜索二维矩阵

在Python中的二进制搜索算法中查找数组的中间索引值

Python:返回矩阵中最小值的行索引

python爬虫Scrapy框架之中间件

Codewars Solution:Get the Middle Character

数字在排序数组中出现的起始索引號