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

2024-04-29 07:52:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pythonxnnumpy双值成对数组(矩阵)。例如,(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)))

UpperTriangalRaynumpy数组有1133265个元素可从中拾取最低的k。在这种情况下,kseventypercentit表示,约为1054个值。但是,当我应用np.argpartition时,只返回0的值

平面阵列upperTriangleArray缩小为一个形状(1133265,)

解决方案

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

upperTriangleArray = dataArray[np.triu_indices(len(dataArray),1)]

seventyPercentInt: int = round((len(upperTriangleArray)/100)*70)

seventyPercentArray = upperTriangleArray[np.argpartition(upperTriangleArray,seventyPercentInt)][0:seventyPercentInt]

我遇到了一些小麻烦(是我自己造成的),因为我使用了Seventypercentit。我没有选择70%的成对元素,而是选择了70%的元素进行比较。两个非常不同的值


Tags: 方法numpy元素lennp情况矩阵数组
1条回答
网友
1楼 · 发布于 2024-04-29 07:52:10

您可以使用np.triu_索引仅保留上部三角形的值

然后可以使用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]

相关问题 更多 >