numpy/python中的向量替换

sds*_*sds 2 python arrays numpy vector python-3.x

由于两个矢量v=['a','b','c']i=np.random.randint(len(v),size=10),我可以得到"替代"矢量

vi = [v[i[x]] for x in range(len(i))]
Run Code Online (Sandbox Code Playgroud)

例如,vi

['a', 'a', 'c', 'c', 'b', 'a', 'c', 'a', 'c', 'a']
Run Code Online (Sandbox Code Playgroud)

如果

i = array([0, 0, 2, 2, 1, 0, 2, 0, 2, 0])
Run Code Online (Sandbox Code Playgroud)

这是否有矢量化操作?

use*_*203 6

您可以简单地使用numpy索引(请注意,您需要转换v为a numpy.array才能使其工作):

v = np.array(['a','b','c'])
i = np.random.randint(len(v),size=10)

>>> v[i]
array(['c', 'b', 'a', 'b', 'c', 'b', 'a', 'a', 'b', 'b'], dtype='<U1')
Run Code Online (Sandbox Code Playgroud)

计时

In [26]: i = np.random.randint(len(v),size=1000000)

In [27]: %timeit [v[i[x]] for x in range(len(i))]
554 ms ± 6.41 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [28]: %timeit v[i]
4.85 ms ± 12.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [29]: %timeit [v[s] for s in i]
505 ms ± 1.95 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)