python - B 在 A 中的值(value)位置索引

标签 python arrays numpy

我在这里遇到了一个棘手的问题......

给定两个数组A和B

A = np.array([8, 5, 3, 7])
B = np.array([5, 5, 7, 8, 3, 3, 3])

我想用 A 中该值的索引替换 B 中的值。在这个示例中,它看起来像:

[1, 1, 3, 0, 2, 2, 2]

对于我正在处理的问题,A 和 B 包含相同的一组值,并且 A 中的所有条目都是唯一的。

解决这个问题的简单方法是使用类似的东西:

for idx in range(len(A)):
    ind = np.where(B == A[idx])[0]
    B_new[ind] = A[idx]

但是我正在使用的 B 数组包含将近一百万个元素,并且使用 for 循环变得非常慢。必须有一种方法可以对此进行矢量化,但我无法弄清楚。我最接近的是做类似的事情

np.intersect1d(A, B, return_indices=True)

但是这只会让我第一次出现 A 的每个元素在 B 中。有什么建议吗?

最佳答案

@mozway 的解决方案适用于小数组但不适用于大数组,因为它在 O(n**2) 时间内运行(即二次时间,请参阅 time complexity 了解更多信息).这是一个基于快速二分搜索的在 O(n log n) 时间(即准线性)运行的大数组的更好的解决方案:

unique_values, index = np.unique(A, return_index=True)
result = index[np.searchsorted(unique_values, B)]

关于python - B 在 A 中的值(value)位置索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72280597/

相关文章:

Python findall 字符串

Java比较数组元素索引与索引

python - namedtuple 和 NamedTuple 有什么区别?

python - 了解 Python 中的数据封装

javascript - 如何定义多维混合数组(包括键和关联值) JavaScript

python - 用 python 解决一个 3x3 Frog 谜题

python - Matplotlib set_data xdata 和 ydata must be same length 错误

python - 识别 pandas 中具有稀疏 nan 的时间序列中的数据组

Python - 基于值绘制网格

python - 按给定行对 3D 数组进行排序