python - numpy:在排序数组中查找索引(以一种有效的方式)

标签 python arrays numpy

<分区>

我想对一个 numpy 数组进行排序,并找出每个元素的去向。

numpy.argsort会告诉我排序数组中的每个索引,未排序数组中的哪个索引去那里。我正在寻找类似逆向的东西:对于未排序数组中的每个索引,它在排序数组中的位置。

a = np.array([1, 4, 2, 3])

# a sorted is [1,2,3,4]
# the 1 goes to index 0
# the 4 goes to index 3
# the 2 goes to index 1
# the 3 goes to index 2

# desired output
[0, 3, 1, 2]

# for comparison, argsort output
[0, 2, 3, 1]

一个简单的解决方案是使用 numpy.searchsorted

np.searchsorted(np.sort(a), a)
# produces [0, 3, 1, 2]

我对这个解决方案不满意,因为它看起来效率很低。它分两个独立的步骤进行排序和搜索。

对于有重复的数组,这种奇特的索引失败了,看:

a = np.array([1, 4, 2, 3, 5])
print(np.argsort(a)[np.argsort(a)])
print(np.searchsorted(np.sort(a),a))


a = np.array([1, 4, 2, 3, 5, 2])
print(np.argsort(a)[np.argsort(a)])
print(np.searchsorted(np.sort(a),a))

最佳答案

您可以在列表中使用 argsort 两次。 乍一看,这项工作似乎有点令人困惑,但如果你仔细考虑一下,就会开始明白这一点。

a = np.array([1, 4, 2, 3])
argSorted = np.argsort(a) # [0, 2, 3, 1]
invArgSorted = np.argsort(argSorted) # [0, 3, 1, 2]

关于python - numpy:在排序数组中查找索引(以一种有效的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54459554/

相关文章:

python - 如何将两个列表作为值插入字典的同一键

python - scipy.stats.linregress、numpy.polynomial.polynomial.polyfit 和 statsmodels.api.OLS 之间的差异

python - 命名实体识别——与字典直接匹配

arrays - Logstash 拆分字段为多个字段或拆分数组为多个字段

python - 将numpy数组转储为字符串的最快方法

arrays - 为什么 lisp 中的列表排序比数组排序更快?

python-2.7 - 处理 Pandas 和 Numpy 中的缺失数据

python - 如何使用 numba 优化 numpy.packbits?

python - 如何填充二维数组?

python - 无法导入我自己的使用 distutils 分发的模块