python – 替换numpy数组中的元素,避免循环

python – 替换numpy数组中的元素,避免循环,第1张

概述我有一个非常大的1d numpy数组Xold与给定的值.这些值应该是 根据2d numpy数组Y指定的规则替换: 一个例子是 Xold=np.array([0,1,2,3,4])Y=np.array([[0,0],[1,100],[3,300],[4,400],[2,200]]) 每当Xold中的值与Y [:,0]中的值相同时,Xnew中的新值应该是Y [:,1]中的对应值.这是通过两个嵌套的f 我有一个非常大的1d numpy数组Xold与给定的值.这些值应该是
根据2d numpy数组Y指定的规则替换:
一个例子是
Xold=np.array([0,1,2,3,4])Y=np.array([[0,0],[1,100],[3,300],[4,400],[2,200]])

每当Xold中的值与Y [:,0]中的值相同时,Xnew中的新值应该是Y [:,1]中的对应值.这是通过两个嵌套的for循环实现的:

Xnew=np.zeros(len(Xold))for i in range(len(Xold)):for j in range(len(Y)):    if Xold[i]==Y[j,0]:        Xnew[i]=Y[j,1]

在给定的示例中,这产生Xnew = [0,100,200,300,400].
但是,对于大型数据集,此过程非常缓慢.什么是更快,更优雅的方式来完成这项任务?

解决方法 选择最快的方法

这个问题的答案提供了一种很好的方法来替换numpy数组中的元素.让我们检查,哪一个是最快的.

TL; DR:Numpy索引是赢家

def meth1(): # suggested by @Slam    for old,new in Y:          Xold[Xold == old] = new def meth2(): # suggested by myself,convert y_dict = dict(Y) first     [y_dict[i] if i in y_dict.keys() else i for i in Xold] def meth3(): # suggested by @Eelco Hoogendoom,import numpy_index as npi first     npi.remap(Xold,keys=Y[:,values=Y[:,1]) def meth4(): # suggested by @Brad Solomon,import pandas as pd first      pd.SerIEs(Xold).map(pd.SerIEs(Y[:,1],index=Y[:,0])).values  # suggested by @jdehesa. create Xnew = Xold.copy() and index  # IDx = np.searchsorted(Xold,Y[:,0]) first  def meth5():                  Xnew[IDx] = Y[:,1]

结果并不那么令人惊讶

In [39]: timeit.timeit(meth1,number=1000000)                                                                       Out[39]: 12.08 In [40]: timeit.timeit(meth2,number=1000000)                                                                       Out[40]: 2.87 In [38]: timeit.timeit(meth3,number=1000000)                                                                       Out[38]: 55.39 In [12]: timeit.timeit(meth4,number=1000000)                                                                                       Out[12]: 256.84 In [50]: timeit.timeit(meth5,number=1000000)                                                                                       Out[50]: 1.12

因此,良好的旧列表理解是第二快的,并且获胜的方法是结合searchsorted()的numpy索引.

总结

以上是内存溢出为你收集整理的python – 替换numpy数组中的元素,避免循环全部内容,希望文章能够帮你解决python – 替换numpy数组中的元素,避免循环所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207151.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存