在成对比较NxN numpy数组中找到N个最小值



我有一个双值的python NxN numpy成对数组(矩阵(。例如,(ij(的每个数组元素都是ij项之间的度量。对角线,其中i=j,是1,因为它是自身的成对测量。这也意味着2D NxN numpy阵列可以以矩阵三角形形式表示(numpy阵列的一半与对角线上的另一半相同(。

截断表示:

[[1.         0.11428571 0.04615385 ... 0.13888889 0.07954545 0.05494505]
[0.11428571 1.         0.09836066 ... 0.06578947 0.09302326 0.07954545]
[0.04615385 0.09836066 1.         ... 0.07843137 0.09821429 0.11711712]
...
[0.13888889 0.06578947 0.07843137 ... 1.         0.34313725 0.31428571]
[0.07954545 0.09302326 0.09821429 ... 0.34313725 1.         0.64130435]
[0.05494505 0.07954545 0.11711712 ... 0.31428571 0.64130435 1.        ]]

我想得到最小的N个值,同时不包括两次成对值,因为成对重复会导致这种情况,例如(5,6(==(6,5(,并且我不想包括任何相同的对角线值1,其中I==j

我知道numpy有分区方法,我看过很多平面数组的例子,但我很难找到任何简单的成对比较矩阵。

编辑#1根据我下面的第一个响应,我实现了:

seventyPercentInt: int = round((populationSizeInt/100)*70)
upperTriangleArray = dataArray[np.triu_indices(len(dataArray),1)]
seventyPercentArray = upperTriangleArray[np.argpartition(upperTriangleArray,seventyPercentInt)][0:seventyPercentInt]
print(len(np.unique(seventyPercentArray)))

上部三角形数组numpy数组有1133265个元素,可以从中选择最低的k。在这种情况下,kseventyPercentInt表示,约为1054个值。然而,当我应用np.argpartition时,只返回0的值。

平面阵列上部三角形阵列缩小为一个形状(1133265,(。

解决方案

根据下面的第一个回复(已接受的答案(,我的代码有效:

upperTriangleArray = dataArray[np.triu_indices(len(dataArray),1)]
seventyPercentInt: int = round((len(upperTriangleArray)/100)*70)
seventyPercentArray = upperTriangleArray[np.argpartition(upperTriangleArray,seventyPercentInt)][0:seventyPercentInt]

我遇到了一些小麻烦(我自己制造的(,SeventyPPercentInt。我没有取70%的成对元素,而是取70%的元素进行比较。两种截然不同的价值观。

您可以使用np.triu_indices只保留上三角形的值。

然后您可以使用np.argpartition,如下例所示。

import numpy as np
A = np.array([[1.0, 0.1, 0.2, 0.3],
[0.1, 1.0, 0.4, 0.5],
[0.2, 0.3, 1.0, 0.6],
[0.3, 0.5, 0.4, 1.0]])
A_upper_triangle = A[np.triu_indices(len(A), 1)]
print(A_upper_triangle)
# return [0.1 0.2 0.3 0.3 0.5 0.4]
k=2
print(A_upper_triangle[np.argpartition(A_upper_triangle, k)][0:k])
#return [0.1 0.2]

最新更新