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

2023-11-26 15:52:04 浏览数 (1)

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

1. 通过np.max和np.where

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

代码语言:txt复制
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)打印出最大值所在的行索引和列索引。

输出:

代码语言:txt复制
[[77 54 16]  
[93 96 43]  
[92 78 88]]  
(array([1]), array([1]))

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

2. 通过np.argmax

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

代码语言:txt复制
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)打印出最大值所在的行索引和列索引。

输出:

代码语言:txt复制
[[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()函数可能不太熟悉,理解代码的过程可能会有一定的难度。

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

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞