gpt4 book ai didi

python - 具有可能重复项的 numpy 数组的排名

转载 作者:太空狗 更新时间:2023-10-29 20:56:39 27 4
gpt4 key购买 nike

我有一个 float /整数的 numpy 数组,想将其元素映射到它们的等级中。

如果一个数组没有重复问题可以通过下面的代码解决

In [49]: a1
Out[49]: array([ 0.1, 5.1, 2.1, 3.1, 4.1, 1.1, 6.1, 8.1, 7.1, 9.1])

In [50]: a1.argsort().argsort()
Out[50]: array([0, 5, 2, 3, 4, 1, 6, 8, 7, 9])

现在我想将此方法扩展到可能有重复项的数组,以便将重复项映射到相同的值。例如,我想要数组 a

a2 = np.array([0.1, 1.1, 2.1, 3.1, 4.1, 1.1, 6.1, 7.1, 7.1, 1.1])

映射到其中一个

0 1 4 5 6 1 7 8 8 1

或到

0 3 4 5 6 3 7 9 9 3

或到

0 2 4 5 6 2 7 8.5 8.5 2

在第一种/第二种情况下,如果我们只应用 a2.argsort().argsort(),我们将重复项映射到它们之间的最小/最大排名。第三种情况只是前两种情况的平均值。

有什么建议吗?

编辑(效率要求)

在最初的描述中,我忘了提及时间要求。我正在寻找 numpy/scipy 函数方面的解决方案,这将避免“纯 python 开销”。为了清楚起见,请考虑理查德提出的解决方案,它实际上解决了问题但速度很慢:

def argsortdup(a1):
sorted = np.sort(a1)
ranked = []
for item in a1:
ranked.append(sorted.searchsorted(item))
return np.array(ranked)

In [86]: a2 = np.array([ 0.1, 1.1, 2.1, 3.1, 4.1, 1.1, 6.1, 7.1, 7.1, 1.1])

In [87]: %timeit a2.argsort().argsort()
1000000 loops, best of 3: 1.55 us per loop

In [88]: %timeit argsortdup(a2)
10000 loops, best of 3: 25.6 us per loop

In [89]: a = np.arange(0.1, 1000.1)

In [90]: %timeit a.argsort().argsort()
10000 loops, best of 3: 24.5 us per loop

In [91]: %timeit argsortdup(a)
1000 loops, best of 3: 1.14 ms per loop

In [92]: a = np.arange(0.1, 10000.1)

In [93]: %timeit a.argsort().argsort()
1000 loops, best of 3: 303 us per loop

In [94]: %timeit argsortdup(a)
100 loops, best of 3: 11.9 ms per loop

从上面的分析可以看出,argsortdup 比 a.argsort().argsort() 慢 30-50 倍。主要原因是python循环和列表的使用。

最佳答案

使用 uniquebincount 可以做得相当好:

>>> u, v = np.unique(a2, return_inverse=True)
>>> (np.cumsum(np.bincount(v)) - 1)[v]
array([0, 3, 4, 5, 6, 3, 7, 9, 9, 3])

或者,对于最低排名:

>>> (np.cumsum(np.concatenate(([0], np.bincount(v)))))[v]
array([0, 1, 4, 5, 6, 1, 7, 8, 8, 1])

通过为 bincount 提供要提供的 bin 数量,可以略微加快速度:

(np.cumsum(np.bincount(v, minlength=u.size)) - 1)[v]

关于python - 具有可能重复项的 numpy 数组的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671013/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com