繁体   English   中英

NumPy:1D numpy数组切片列表

[英]NumPy: 1D numpy array to slice a list

如何提取与1D numpy.ndarray包含的索引相对应的列表元素?

这是一个例子:

list_data = list(range(1, 100))
arr_index = np.asarray([18, 55, 22])
arr_index.shape

list_data[arr_index]  # FAILS

我希望能够检索与list_data相对应的arr_index元素。

你可以使用numpy.take -

import numpy as np
np.take(list_data,arr_index)

样品运行 -

In [12]: list_data = list(range(1, 20))

In [13]: list_data
Out[13]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

In [14]: arr_index = np.asarray([3, 5, 12])

In [15]: np.take(list_data,arr_index)
Out[15]: array([ 4,  6, 13])

要么

import numpy as np
list_data = list(range(1, 100))
arr_index = np.asarray([18, 55, 22])
arr_index.shape

new_ = [list_data[i] for i in arr_index]

>> [19, 56, 23]

注意

list_data = list(range(1, 100)可以替换为list_data = range(1, 100)

arr_index = np.asarray([18, 55, 22])可以替换为arr_index = np.array([18, 55, 22])

我刚做了一些时间测试:

In [226]: ll=list(range(20000))    
In [227]: ind=np.random.randint(0,20000,200)

In [228]: timeit np.array(ll)[ind]
100 loops, best of 3: 3.29 ms per loop

In [229]: timeit np.take(ll,ind)
100 loops, best of 3: 3.34 ms per loop

In [230]: timeit [ll[x] for x in ind]
10000 loops, best of 3: 65.1 µs per loop

In [231]: arr=np.array(ll)
In [232]: timeit arr[ind]
100000 loops, best of 3: 6 µs per loop

列表理解显然是胜利者。 索引数组显然更快,但创建该数组的开销很大。

转换为对象dtype数组更快。 我有点惊讶,但它必须是因为它可以转换而无需解析:

In [236]: timeit np.array(ll,dtype=object)[ind].tolist()
1000 loops, best of 3: 1.04 ms per loop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM