2015-06-03 2 views
3

Как я могу извлечь элементы списка, соответствующие индексам, содержащимся в 1D numpy.ndarray?NumPy: массив 1D numpy для нарезания списка

Вот пример:

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.

ответ

4

Вы можете использовать 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]) 
+0

Так что первый аргумент 'array_like', что означает, что список приводится к' ndarray' перед использованием? – tchakravarty

+0

Что не так с простой индексацией? – Kasramvd

+0

@Kasra Что вы подразумеваете под * простым * индексированием? – tchakravarty

1

ИЛИ

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])

+2

В py3 вам нужно 'list (range())', если вы не выполните итерацию сразу. – hpaulj

1

Я просто сделал некоторые временные испытания:

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 
Смежные вопросы