微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找最大值和最大值的索引,而无需使用max内置函数

如何解决查找最大值和最大值的索引,而无需使用max内置函数

就像标题中所说的那样,我试图在不使用内置max函数任何变化的情况下找到参数的最大值和位置。

我能够将它们拼凑成一个基本的np.array,但是我很难将其转换成矩阵...我认为是因为它是如何索引的。

np.array内容如下:

a = np.array((1,2,3,4,1,3))

def argmax(x):
    maximum = 0
    for i in range(len(x)):
        if x[i] > maximum: maximum = x[i]
    pos = np.argwhere(x == maximum)[0][0]
    return(print('The maximum value of the array is',maximum,'and is located at index',pos))

argmax(a)

数组的最大值为4,位于索引4处。

我正在尝试为任何大小的矩阵创建类似的东西,而不使用内置的max函数。有人可以帮助我使用该功能,并帮助我了解基本数组和矩阵之间的索引差异吗?

解决方法

这适用于一维数组和二维数组:

import numpy as np
import math

matrix = np.arange(20).reshape(4,5)
print(matrix)
# Important
matrix = np.atleast_2d(matrix)
# set maximum to -inf
maximum = -math.inf
# Search maximum
for j in range(matrix.shape[1]):
    for i in range(matrix.shape[0]):
        maximum = matrix[i][j] if matrix[i][j] > maximum else maximum

# More than 1 maximum,take the first one?
pos = np.argwhere(matrix == maximum)[0]
print(
    f"The maximum value of the array is: {maximum},located at: row {pos[0]},column {pos[1]}"
)

输出:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
The maximum value of the array is: 19,located at: row 3,column 4
,

这是对任何形状和尺寸数组执行此操作的一种方法(它假定值是非负的,因为您将max初始化为0并仅像您在操作中那样返回max的第一次出现原始答案。您当然可以轻松更改它们):

def argmax(x):
    maximum = 0
    for i,v in enumerate(x.reshape(-1)):
        if v > maximum: 
            maximum = v
            pos = i
    print('The maximum value of the array is',maximum,'and is located at index',np.unravel_index(pos,x.shape))

argmax(a)

示例:

a = np.random.randint(0,10,(3,4))
#[[7 6 2 6]
# [7 2 0 5]
# [4 0 8 7]]

输出:

The maximum value of the array is 8 and is located at index (2,2)
,

我假设您想沿着给定的轴找到最大值。否则,请执行np.unravel_index(argmax(a.ravel()),a.shape)

首先让我们定义一个函数,该函数沿给定的维度移动并跟踪最大值和它们出现的索引:

def argmax(a,axis):
    # index
    cur = [slice(None) for _ in range(a.ndim)]
    cur[axis] = 0

    # trackers
    val = a[tuple(index)]
    ind = np.zeros(val.shape,dtype=int)

    # loop
    for i in range(1,a.shape[axis]):
        index[axis] = i
        v = a[tuple(index)]
        mask = v > val
        val[mask] = v[mask]
        ind[mask] = i
    return ind

这将返回沿axis的索引。如果要获取其他索引,请执行类似的操作

all_indices = list(np.indices(a.shape))
all_indices[axis] = ind
all_indices = tuple(all indices)

或者,

all_indices = [slice(None) for _ range(a.ndim)]
all_indices[axis] = ind
all_indices = tuple(all indices)

此功能会跳过几个极端情况,例如a.shape[axis] == 0a.ndim == 0时,但是您可以通过简单的初步测试轻松地处理它们。

您也可以将axis=None特例化为递归调用,如答案开头所示。

如果要同时允许多个轴,请将其全部交换到末端,然后将其重塑为一个轴。因此,axis=None和常规处理是混合的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。