我有一个pythonxnnumpy双值成对数组(矩阵)。例如,(i,j)的每个数组元素是i和j项之间的测量值。对角线,其中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。在这种情况下,k由seventypercentit表示,约为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%的元素进行比较。两个非常不同的值
您可以使用np.triu_索引仅保留上部三角形的值
然后可以使用np.argpartition,如下例所示
相关问题 更多 >
编程相关推荐