Numpy 数组对所有元素进行排序
Numpy Array Rank All Elements
我有一个二维 numpy 数组,我想知道如何创建一个新的二维 numpy 数组来表示基于 all 项的值的排名原始二维数组。
我想使用以下数组:
anArray = [[ 18.5, 25.9, 7.4, 11.1, 11.1]
[ 33.3, 37. , 14.8, 22.2, 25.9]
[ 29.6, 29.6, 11.1, 14.8, 11.1]
[ 25.9, 25.9, 14.8, 14.8, 11.1]
[ 29.6, 25.9, 14.8, 11.1, 7.4]]
创建一个新的排序数组[基于所有值并且对多个数字具有相同的排序]:
anOrder = [[ 6, 4, 9, 8, 8]
[ 2, 1, 7, 5, 4]
[ 3, 3, 8, 7, 8]
[ 4, 4, 7, 7, 8]
[ 3, 4, 7, 8, 9]]
谢谢。
这是 np.unique
的常规工作,它的可选参数 return_inverse
根据其他元素之间的唯一性来标记每个元素,就像这样 -
_,id = np.unique(anArray,return_inverse=True)
out = (id.max() - id + 1).reshape(anArray.shape)
样本运行-
In [17]: anArray
Out[17]:
array([[ 18.5, 25.9, 7.4, 11.1, 11.1],
[ 33.3, 37. , 14.8, 22.2, 25.9],
[ 29.6, 29.6, 11.1, 14.8, 11.1],
[ 25.9, 25.9, 14.8, 14.8, 11.1],
[ 29.6, 25.9, 14.8, 11.1, 7.4]])
In [18]: _,id = np.unique(anArray,return_inverse=True)
In [19]: (id.max() - id + 1).reshape(anArray.shape)
Out[19]:
array([[6, 4, 9, 8, 8],
[2, 1, 7, 5, 4],
[3, 3, 8, 7, 8],
[4, 4, 7, 7, 8],
[3, 4, 7, 8, 9]])
您可以将 scipy.stats.rankdata
与 method='dense'
一起使用。它对 flattened 输入的值进行排序,因此您必须恢复 rankdata
返回的数组的形状。
例如,
In [21]: anArray
Out[21]:
[[18.5, 25.9, 7.4, 11.1, 11.1],
[33.3, 37.0, 14.8, 22.2, 25.9],
[29.6, 29.6, 11.1, 14.8, 11.1],
[25.9, 25.9, 14.8, 14.8, 11.1],
[29.6, 25.9, 14.8, 11.1, 7.4]]
In [22]: a = np.array(anArray)
In [23]: r = rankdata(a, method='dense').reshape(a.shape)
In [24]: ranks = (r.max()+1) - r
In [25]: ranks
Out[25]:
array([[6, 4, 9, 8, 8],
[2, 1, 7, 5, 4],
[3, 3, 8, 7, 8],
[4, 4, 7, 7, 8],
[3, 4, 7, 8, 9]])
注意 rankdata
排名从低到高,从 0 开始,因此排名 r
被反转并设置为从 1 开始与行 ranks = (r.max()+1) - r
.
我有一个二维 numpy 数组,我想知道如何创建一个新的二维 numpy 数组来表示基于 all 项的值的排名原始二维数组。
我想使用以下数组:
anArray = [[ 18.5, 25.9, 7.4, 11.1, 11.1]
[ 33.3, 37. , 14.8, 22.2, 25.9]
[ 29.6, 29.6, 11.1, 14.8, 11.1]
[ 25.9, 25.9, 14.8, 14.8, 11.1]
[ 29.6, 25.9, 14.8, 11.1, 7.4]]
创建一个新的排序数组[基于所有值并且对多个数字具有相同的排序]:
anOrder = [[ 6, 4, 9, 8, 8]
[ 2, 1, 7, 5, 4]
[ 3, 3, 8, 7, 8]
[ 4, 4, 7, 7, 8]
[ 3, 4, 7, 8, 9]]
谢谢。
这是 np.unique
的常规工作,它的可选参数 return_inverse
根据其他元素之间的唯一性来标记每个元素,就像这样 -
_,id = np.unique(anArray,return_inverse=True)
out = (id.max() - id + 1).reshape(anArray.shape)
样本运行-
In [17]: anArray
Out[17]:
array([[ 18.5, 25.9, 7.4, 11.1, 11.1],
[ 33.3, 37. , 14.8, 22.2, 25.9],
[ 29.6, 29.6, 11.1, 14.8, 11.1],
[ 25.9, 25.9, 14.8, 14.8, 11.1],
[ 29.6, 25.9, 14.8, 11.1, 7.4]])
In [18]: _,id = np.unique(anArray,return_inverse=True)
In [19]: (id.max() - id + 1).reshape(anArray.shape)
Out[19]:
array([[6, 4, 9, 8, 8],
[2, 1, 7, 5, 4],
[3, 3, 8, 7, 8],
[4, 4, 7, 7, 8],
[3, 4, 7, 8, 9]])
您可以将 scipy.stats.rankdata
与 method='dense'
一起使用。它对 flattened 输入的值进行排序,因此您必须恢复 rankdata
返回的数组的形状。
例如,
In [21]: anArray
Out[21]:
[[18.5, 25.9, 7.4, 11.1, 11.1],
[33.3, 37.0, 14.8, 22.2, 25.9],
[29.6, 29.6, 11.1, 14.8, 11.1],
[25.9, 25.9, 14.8, 14.8, 11.1],
[29.6, 25.9, 14.8, 11.1, 7.4]]
In [22]: a = np.array(anArray)
In [23]: r = rankdata(a, method='dense').reshape(a.shape)
In [24]: ranks = (r.max()+1) - r
In [25]: ranks
Out[25]:
array([[6, 4, 9, 8, 8],
[2, 1, 7, 5, 4],
[3, 3, 8, 7, 8],
[4, 4, 7, 7, 8],
[3, 4, 7, 8, 9]])
注意 rankdata
排名从低到高,从 0 开始,因此排名 r
被反转并设置为从 1 开始与行 ranks = (r.max()+1) - r
.