我有一个简单的二维numpy矩阵,我需要找到矩阵中的n个最小值。我已经找到了一些函数是这样做的numpy数组(argpartition),但我不确定它是否会在一个矩阵上工作,不会改变矩阵本身。我还发现一个列表矩阵使用heapmin,但它似乎很复杂,我有一个numpy矩阵。我希望矩阵不会改变,但是我可以使用np.copy()来忽略这个问题。最小值可以是任何地方。如果有人知道如何面对这个问题,它会很有帮助。谢谢你! 根据要求,我创建了一个简短的代码来强调我需要什么:
import numpy as np
def create_nm_matrix(n,m):
data=np.random.rand(n,m)
return data
#I need to find the n minimum values the values
#can repeat themself
def find_n_minimum_values(mat,n):
pass
mat=create_nm_matrix(100,50)
n=3
print("The array of the 3 minimum values in the matrix is:")
print(find_n_minimum_values(mat,n))
问题来源StackOverflow 地址:/questions/59466393/how-to-find-the-top-n-minimum-values-in-a-two-dimensional-numpy-matrix
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
虽然numpy数组中有argmax的函数可以获得数组的最大值的索引,但该函数获得的是numpy数组平铺后的索引,也就是一维索引。那么要怎样才能获得二维索引呢?实现很简单,比如我下面的代码:
import numpy as np
import math
a = np.array([[1, 2, 3],
[4, 5, 6]])
m, n = a.shape
index = int(a.argmax())
x = int(index / n)
y = index % n
print(x, y)
>>>1 2
虽然math和numpy都有取整的方法,math.ceil向上取整,math.floor向下取整,math.round四舍五入取整。但获得的结果是float型。所以这里使用int()向下取整获得int型结果。 虽然我们实现了二维索引的获取,但是如果是三维呢?
import numpy as np
import math
a = np.array([[[1, 2, 3],
[4, 5, 6]]])
m, n, l = a.shape
index = int(a.argmax())
x = int(index / (n*l))
index = index % (n*l)
y = int(index/l)
index = index % l
z = index
print(x, y, z)
>>>0 1 2
很好理解,但是很繁琐,这里有一种简单的方法利用np.unravel_index()获取索引。 至于np.unravel_index函数https://blog.csdn.net/dn_mug/article/details/70256109说的比较清楚。
对于二维数组:
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
index = np.unravel_index(a.argmax(), a.shape)
print(index)
>>>(1, 2)
三维数组:
import numpy as np
a = np.array([[[1, 2, 3],
[4, 5, 6]]])
index = np.unravel_index(a.argmax(), a.shape)
print(index)
>>>(0, 1, 2)