python - 如何有效地访问另一个可迭代的 Python 可迭代索引证明

标签 python arrays list loops numpy

我有一个列表 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]

如果XY 被转换为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/

相关文章:

jQuery:对列表项进行排序但保留类

javascript - 如何将变量从 javascript 表单传递给 python(在同一台计算机上)?

python - 如何使用unittest.TestResult?

Javascript:从存储在 localStorage 中的数组中删除对象?

arrays - 有没有一种方法可以循环整数数组,跟踪所有唯一元素而不分配新数组?

java - 列表打印为空

python - 使用循环从 CSV 获取数据数组

python - python 中如何验证用户输入是字母还是空格?

arrays - Powershell替换数组错误中的值

list - 在记录列表中添加元素 (OCaml)