开发者社区 问答 正文

如何在二维numpy矩阵中找到n个最大值

已解决

我有一个简单的二维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

展开
收起
kun坤 2019-12-25 10:01:00 2129 分享 版权
1 条回答
写回答
取消 提交回答
  • 采纳回答

    虽然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)
    
    2019-12-25 11:36:14
    赞同 1 展开评论
问答分类:
问答地址: