我有一个列表 X
和一个列表 Y
,其中有一些打乱的索引。
X = ['a', 'b', 'c', 'd','e']
Y = [ 1 , 3 , 4 , 0 , 2 ]
我想要一个新列表 Z
这样
Z = [ X[i] for i in Y ] = ['b', 'd', 'e', 'a', 'c']
问题是对于如此大的数组
,我必须多次执行此操作。有比循环列表更有效的方法吗?
注意:numpy
解决方案值得赞赏!
最佳答案
自 operator.itemgetter
接受多个索引,一种解决方案是:
>>> import operator
>>> operator.itemgetter(*Y)(X)
('b', 'd', 'e', 'a', 'c')
高效的方法(如评论中所述)是通过 numpy
的数组索引:
np.array(X)[Y]
但仅如果X
和Y
被转换为numpy.array
一次(使用前)并且多次使用。
性能测试
从 1M
元素(X
)的列表中索引 1k
元素(Y
)。
# setup
import random
import numpy as np
X = [random.randint(0,100) for i in range(1000000)]
Y = [random.randint(0,1000000) for i in range(1000)]
1) 列表理解 ~ 34 µs
%timeit [X[i] for i in Y]
10000 loops, best of 3: 34 µs per loop
2) itemgetter
~ 16.6 µs
%timeit operator.itemgetter(*Y)(X)
100000 loops, best of 3: 16.6 µs per loop
3) numpy
,动态转换数组 ~ 31.6 毫秒 ⇒ 最慢
%timeit np.array(X)[Y]
10 loops, best of 3: 31.6 ms per loop
4) numpy
,数组预转换 ~ 1.72 µs ⇒ 最快
x = np.array(X)
y = np.array(Y)
%timeit x[y]
1000000 loops, best of 3: 1.72 µs per loop
关于python - 如何有效地访问另一个可迭代的 Python 可迭代索引证明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46840226/