如何解决查找最大值和最大值的索引,而无需使用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] == 0
和a.ndim == 0
时,但是您可以通过简单的初步测试轻松地处理它们。
您也可以将axis=None
特例化为递归调用,如答案开头所示。
如果要同时允许多个轴,请将其全部交换到末端,然后将其重塑为一个轴。因此,axis=None
和常规处理是混合的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。