python - 在 numpy 中执行间接排序,为相同元素保留相同索引

标签 python numpy scipy

假设我有一个像这样的数组:

a = np.array([5, 2, 13, 13, 222])

我想将它转换为这样的数组:

b = np.array([1, 0, 2, 2, 3])

我尝试过 np.argsort,但返回

np.argsort(np.array([5, 2, 13, 13, 222])) # = array([1, 0, 2, 3, 4])

这并不完全符合我需要它做的事情(它仍然为相同的元素分配不同的索引。

到目前为止,我已经编写了这个小函数来完成我想要的事情:

def indexate_array(v):
    v_unique = np.unique(v)
    result = shape_like(v)
    dic = {value: result for value, result in zip(v_unique, np.argsort(v_unique))}
    for i, val in enumerate(v):
        result[i] = dic[val]
    return result

是否有一种优雅的方式来使用 numpy/scipy 执行我想要的操作?

最佳答案

这就是 numpy.uniquereturn_inverse 参数。是:

In [5]: np.unique(a, return_inverse=True)
Out[5]: (array([  2,   5,  13, 222]), array([1, 0, 2, 2, 3]))

关于python - 在 numpy 中执行间接排序,为相同元素保留相同索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37692618/

相关文章:

python - 缓存装饰器 Python

python - "ssh"Paramiko 中的等效代理命令

python - 在python中绘制正弦波时出现问题

python - Python 中的数值积分与矢量化函数的自适应求积

python - 按索引雕刻二维 numpy 数组

python - 将 scipy 稀疏矩阵存储为 HDF5

python - 为什么 scipy 为结果应该为零的积分提供非零结果?

python - 基本的Python查询

python - 数字列表 - 如何找到重复模式?

python - 百分等级计算