如何使用Python找出矩阵中最大值的位置

简介: 如何使用Python找出矩阵中最大值的位置

实际工程中发现,Python做for循环非常缓慢,因此转换成numpy再找效率高很多。numpy中有两种方式可以找最大值(最小值同理)的位置。


1. 通过np.max和np.where


通过np.max()找矩阵的最大值,再通过np.where获得最大值的位置,测试如下:


a = np.random.randint(10, 100, size=9)
a = a.reshape((3,3))
print(a)
r, c = np.where(a == np.max(a))
print(r,c)


代码分析:

首先,我们导入了NumPy库并为其分配了别名np。这个库为我们提供了用于处理数组和矩阵的功能。

然后我们使用np.random.randint(10, 100, size=9)函数随机生成了一个包含9个10到100之间随机整数的一维数组。其中,np.random.randint函数的第一个参数是生成随机整数的下界(包含),第二个参数是上界(不包含),第三个参数size指定了数组的大小。

接着,我们调用了a.reshape((3,3))来将这个一维数组重塑为一个3x3的二维数组。reshape函数用于改变数组的形状,它接受一个元组作为参数,指定了新的形状。我们通过传入(3,3),将一维数组转换为3行3列的二维数组。

然后,代码使用print(a)打印出了重塑后的二维数组a。这将显示形状为3行3列的矩阵,其中的元素为随机生成的整数。

代码r, c = np.where(a == np.max(a))的作用是找到数组a中的最大值,并确定该最大值所在的行和列。np.max(a)返回数组a中的最大值,然后np.where(a == np.max(a))返回一个包含最大值位置索引的元组。这个元组被解包给了变量rc,其中r表示行索引,c表示列索引。

最后我们使用print(r, c)打印出最大值所在的行索引和列索引。

输出:


[[77 54 16]  
[93 96 43]  
[92 78 88]]  
(array([1]), array([1]))


注意,np.where输出的是两个array,需要从中取出坐标。


2. 通过np.argmax


np.argmax可以直接返回最大值的索引,不过索引值是一维的,需要做一下处理得到其在二维矩阵中的位置。


a = np.random.randint(10, 100, size=9)
a = a.reshape((3,3))
print(a)
m = np.argmax(a)
r, c = divmod(m, a.shape[1])
print(r, c)


代码分析: 我们在之前的基础上进一步计算了最大值在二维数组中的行索引和列索引。

首先,我们随机生成整数数组并对其进行了重塑,与之前相同。

然后,我们使用np.argmax(a)函数来找到数组a中的最大值,并返回其在展平(flatten)数组中的索引。np.argmax函数返回数组中最大值的索引,我们在这里直接将结果保存在变量m中。

接着我们使用divmod(m, a.shape[1])来计算最大值索引m对应的行索引和列索引。divmod函数将除法和取模运算结合起来,接受两个参数,第一个参数是被除数,第二个参数是除数。在我们这里,被除数是m,除数是a.shape[1],也就是二维数组a的列数。函数返回一个元组,包含商和余数。这里将商(整除结果)保存在变量r中,余数(模数)保存在变量c中。

最后我们使用print(r, c)打印出最大值所在的行索引和列索引。

输出:


[[42 86 40]
 [63 36 77]
 [38 60 98]]
(2, 2)


3.总结


第一种方法

优点:

  1. 使用了NumPy库提供的函数和方法,简化了数组操作和计算最大值的过程。
  2. 通过使用np.where()函数,可以一次性找到数组中所有满足条件的元素的位置,而不仅仅是最大值。
  3. 代码逻辑简单明了,易于理解和实现。

缺点:

  1. 使用了两次数组重塑操作,可能会带来一定的性能开销,特别是在处理更大的数组时。
  2. 只考虑了数组中最大值的位置,没有处理多个元素具有相同最大值的情况。

第二种方法

优点:

  1. 使用了np.argmax()函数,直接找到展平数组中的最大值索引,避免了使用np.where()函数的额外操作。
  2. 使用了divmod()函数,将索引转换为行索引和列索引,代码更简洁。
  3. 只需要进行一次数组重塑操作。

缺点:

  1. 只能找到最大值的位置,无法处理多个元素具有相同最大值的情况。
  2. 对于初学者来说,np.argmax()divmod()函数可能不太熟悉,理解代码的过程可能会有一定的难度。

总结第一种方法适用于简单的数组操作和寻找最大值的情况,代码逻辑清晰,易于理解。第二种方法则更加简洁,适用于处理较大的数组,但需要注意无法处理多个最大值的情况。在选择使用哪一段代码时,可以根据具体需求和性能考虑做出选择。

目录
相关文章
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
PYTHON TENSORFLOW 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估|数据分享
PYTHON TENSORFLOW 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估|数据分享
|
1月前
|
Python
Python计算误码率,输入是0-1比特流矩阵和小数矩阵
本文提供了一个Python函数calculate_ber,用于计算两个NumPy矩阵表示的二进制信号和接收信号之间的误码率(BER),其中包括信号与接收信号的比较、误差计数以及BER的计算过程,并给出了具体的使用示例。
39 2
|
4月前
|
索引 Python
Python 中寻找列表最大值位置的方法
本文介绍了Python中找列表最大值及其位置的三种方法:1) 使用内置`max()`和`index()`函数;2) 通过循环遍历;3) 利用`enumerate()`函数和生成器表达式。每种方法均附有示例代码,其中`enumerate()`方法在保证效率的同时代码更简洁。
174 2
|
9天前
|
Python
Python 练习实例44 - Python 两个矩阵相加
Python 练习实例44 - Python 两个矩阵相加
|
1月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
21 4
|
1月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
17 0
【Leetcode刷题Python】73. 矩阵置零
|
3月前
|
机器学习/深度学习 数据处理 索引
Python遍历矩阵的技巧与实践
Python遍历矩阵的技巧与实践
46 2
|
3月前
|
计算机视觉 Python
Python矩阵转灰度图技术解析
Python矩阵转灰度图技术解析
42 1
|
2月前
|
Python
打印9*9乘法表(递归或压缩矩阵)python
打印9*9乘法表(递归或压缩矩阵)python
|
4月前
|
机器学习/深度学习 数据采集 自然语言处理
图像分类模型评估之用python绘制混淆矩阵confusion_matrix_python confusion_matrix
图像分类模型评估之用python绘制混淆矩阵confusion_matrix_python confusion_matrix