gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:14:34 25 4
gpt4 key购买 nike

我有一个相当大的 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[:, 0], 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

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

关于python - 替换 numpy 数组中的元素避免循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53155749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com