当前位置: 首页 > 面试题库 >

获取二维numpy ndarray或numpy矩阵中前N个值的索引

姚建树
2023-03-14
问题内容

我有N维向量数组

data = np.array([[5, 6, 1], [2, 0, 8], [4, 9, 3]])

In [1]: data
Out[1]:
array([[5, 6, 1],
       [2, 0, 8],
       [4, 9, 3]])

我正在使用sklearn的pairwise_distances函数来计算距离值矩阵。注意,该矩阵关于对角线对称。

dists = pairwise_distances(data)

In [2]: dists
Out[2]:
array([[  0.        ,   9.69535971,   3.74165739],
       [  9.69535971,   0.        ,  10.48808848],
       [  3.74165739,  10.48808848,   0.        ]])

我需要与该矩阵中前N个值dists相对应的索引,因为这些索引将与成对索引相对应,data它们代表了向量之间的最大距离。

我尝试做np.argmax(np.max(distances, axis=1))以获得每一行中最大值的索引,并np.argmax(np.max(distances, axis=0))获取每一列中最大值的索引,但是请注意:

In [3]: np.argmax(np.max(dists, axis=1))
Out[3]: 1

In [4]: np.argmax(np.max(dists, axis=0))
Out[4]: 1

和:

In [5]: dists[1, 1]
Out[5]: 0.0

因为矩阵是关于对角线对称的,并且因为argmax返回它找到的具有最大值的第一个索引,所以我最终在行和列匹配存储最大值的对角线上的单元格而不是行和列最高值本身的列。

在这一点上,我确定我可以编写更多代码来查找所需的值,但是肯定有一种更简单的方法可以执行我要执行的操作。因此,我有两个大致相同的问题:

如何找到矩阵中与前N个值相对应的索引或者如何找到与向量数组成对的前N个成对距离的向量?


问题答案:

我会拉扯,argsort,然后解散。我并不是说这是最好的方法,只是这是我想到的第一种方法,在有人发表更明显的内容后,我可能会羞愧地删除它。:-)

就是说(任意选择前两个值):

In [73]: dists = sklearn.metrics.pairwise_distances(data)

In [74]: dists[np.tril_indices_from(dists, -1)] = 0

In [75]: dists
Out[75]: 
array([[  0.        ,   9.69535971,   3.74165739],
       [  0.        ,   0.        ,  10.48808848],
       [  0.        ,   0.        ,   0.        ]])

In [76]: ii = np.unravel_index(np.argsort(dists.ravel())[-2:], dists.shape)

In [77]: ii
Out[77]: (array([0, 1]), array([1, 2]))

In [78]: dists[ii]
Out[78]: array([  9.69535971,  10.48808848])


 类似资料:
  • 关于上一个问题: 删除2D矩阵中的全零行 输出: 好的,到目前为止还不错,但是如果我添加空列呢? 输出为 这不是我想要的。 基本上如果我的矩阵是: 我期待的输出是

  • 问题内容: 给定NumPy矩阵(2D数组),返回数组中的最小值/最大值(及其索引)的有效方法是什么? 目前我有: 这比用于生成要在其上运行数组的图像模板匹配算法要长三倍,而我认为这很愚蠢。 问题答案: 从另一个答案开始,NumPy添加了和函数进行部分排序,使您可以及时执行此操作,或者如果您需要按排序顺序排列的元素。 返回一个数组的大小,其中第i个元素是这将是什么,如果该阵列被分选。所有较小的元素都

  • 问题内容: NumPy提出了一种通过来获取数组最大值的索引的方法。 我想要类似的事情,但是返回N最大值的索引。 例如,如果我有一个数组,,将返回的索引相对应的元素。 问题答案: 我想出的最简单的方法是: 这涉及数组的完整排序。我想知道是否提供了一种进行部分排序的内置方法。到目前为止,我还没有找到一个。 如果此解决方案太慢(尤其是对于小型解决方案n),则可能值得考虑使用进行编码。

  • 问题内容: 给定一个numpy数组(或pandas数据框),如下所示: 我正在寻找最有效地检索每一行中最后一个非nan值的方法,因此在这种情况下,我将寻找一个返回如下内容的函数: 我可以尝试一下,但是它至少具有两个不希望的属性- 对于以(dealbreaker)结尾的行,它会失败;并且,一旦达到给定行中的最后一个非nan值,它就不会“延迟评估”并停止(这与“必须正确”条件无关紧要)。 我想有一种方

  • 我目前有以下问题,给定一个数组,为了简单起见,假设一个4 x 4数组(我实际上正在使用512 x 512) 我想在数组周围循环/滑动,这样我就可以在表单中保存新数组 < code>np.array([3,5],[7,6]),np.array([2,4],[8,8]),np.array([1,6],[2,1]),np.array ([7,7],[1,4])等等(理想情况下,我可以选择我的“滑动”窗口

  • 我需要在灰度图像中分割出异常。在算法的某个地方,我计算一个矩阵,其中包含需要设置为零的已知像素强度。我该怎么做? 例如: 计算的像素强度:(数组([94,95,96,97,98,99,100,101,102,103,104,105,106,107、108,109,110,111、112、113、114、115、116、117、118、119、120、121、122、123、124、125、126、