Numpy:如何高效将数组A元素替换为数组B匹配元素的索引
Numpy大数组元素替换为对应唯一值索引的高效实现
场景说明
你需要将数组A中的每个元素替换为其在唯一值数组B中的对应索引,针对A长度1800万、B长度13.8万的大数据量场景,推荐以下纯Numpy的高效实现,所有方案均为C级别的运算效率,避免Python层循环的性能损耗。
方案1:未生成B时的最优解
如果你还没有预先计算出唯一值数组B,直接通过np.unique的return_inverse参数一步得到结果,这是性能最高的方案:
import numpy as np # A为原始输入数组 B, C = np.unique(A, return_inverse=True)
该方案内部已完成去重和索引映射的全流程优化,1800万长度的数组通常可在2秒内完成运算。
方案2:已有排序后的B
如果你已经预先得到了排序后的B(np.unique默认返回的B就是升序排列的),直接使用np.searchsorted实现映射:
C = np.searchsorted(B, A)
该方案时间复杂度为O(len(A) * log(len(B))),针对你的数据规模,运算耗时和方案1接近。
方案3:已有未排序的B
如果你的B不是升序排列,通过排序索引适配searchsorted即可:
# 先得到B的排序索引 b_sorter = np.argsort(B) # 映射得到C C = b_sorter[np.searchsorted(B, A, sorter=b_sorter)]
该方案仅比前两种多一次13.8万长度数组的排序开销,几乎可忽略不计。
禁止使用的低效率方案
不要使用Python层的字典遍历、列表推导式等实现,这类方案在千万级数据规模下耗时会达到几十秒甚至数分钟,完全不满足性能要求。
内容的提问来源于stack exchange,提问作者dangtony98
相关产品推荐
相关产品推荐

