最值索引
对于一维数组(仅返回匹配到的第一个最值),argmax()和argmin()最常用。PS:如果输入的数组是多维的,也会先展平(flatten)转化为一维数组。
import numpy as np
# 最小值用np.argmin()
arr = np.array([3, 1, 4, 1, 5, 9, 2])
max_idx = np.argmax(arr)
print(max_idx) # 输出: 5 (值为9的索引)
print(arr[max_idx]) # 输出: 9
对于多维数组我推荐两种方法,其一是采用unravel_index() ,它的作用是将展平(flatten)后的索引转换为原始多维数组的坐标索引。
但该方法依然基于argmax()和argmin(),所以仅返回匹配到的第一个最值
import numpy as np
arr = np.array([[1, 5, 3],
[7, 2, 4]])
# 获取多维数组中的位置
max_idx_flat = np.argmax(arr)
max_idx_multi = np.unravel_index(max_idx_flat, arr.shape)
print(max_idx_multi) # 输出: (1, 0) 即第1行第0列
print(arr[max_idx_multi]) # 输出: 7
# 一步到位的方法
max_idx_multi = np.unravel_index(np.argmax(arr), arr.shape)
print(max_idx_multi) # (1, 0)
另外,我比较常用的是where() ,它可以处理多个最值,可以作为条件搜索。
import numpy as np
arr = np.array([[9, 1, 9],
[3, 9, 2]])
# 获取最值
max_value = np.max(arr)
# 建立mask = arr == max_value
all_max_idx = np.where(arr == max_value)
# np.where将最值对应的行列分开储存为数组
print(all_max_idx) # (array([0, 0, 1]), array([0, 2, 1]))
# 即 (0,0), (0,2), (1,1) 三个位置
# 转换为坐标列表
coords = list(zip(all_max_idx[0], all_max_idx[1]))
print(coords) # [(0, 0), (0, 2), (1, 1)]