2016-08-09 3 views
0

Я не уверен, есть ли общий ответ на мой вопрос, но я задаюсь вопросом, является ли маскирование или нарезка массива «лучше» манипулировать только частями массива. С «лучше» я имею в виду производительность (скорость выполнения манипуляций, накладные расходы памяти, т. Е. Промежуточные массивы и т. Д.). Есть ли какое-либо эмпирическое правило о том, какой из них использовать?Нарезка или маскировка?

+0

«замаскирован» может быть истолковано как с помощью 'np.ma' или более простой 'my_array [my_boolean_mask]', который создает копию. Что ты имеешь в виду? – Julien

+0

Нарезка будет лучше, потому что она освобождает память. В то время как маскирование хранит его в кеше. – thesonyman101

+0

Я имел в виду 'np.ma'. Я понял 'my_array [my_boolean_mask]' как способ разрезания. – orange

ответ

0

Таковы некоторые результаты, используя timeit

import numpy as np 

x= np.arange(10000) 

% timeit x[[np.arange(0,10000,2)]] 
#output: 10000 loops, best of 3: 41.4 µs per loop 

Назначение индексированных значений в другой массив

% timeit z = x[[np.arange(0,10000,2)]] 
#output: 10000 loops, best of 3: 41.9 µs per loop 

или, присваивая значения индексированного массива

% timeit x[[np.arange(0,10000,2)]] = 1 
#output: 1000 loops, best of 3: 151 µs per loop 

Теперь давайте попробуем такой же используя маскировка:

x = np.ma.array(np.arange(10000)) 

% timeit x.mask = [1 if i%2==0 else 0 for i in np.arange(10000)] 
#output: 100 loops, best of 3: 11.6 ms per loop 

Если у вас уже есть значения, маска хранится

maskValues = [1 if i%2==0 else 0 for i in np.arange(10000)] 

% timeit x.mask = maskValues 
# output: 1000 loops, best of 3: 712 µs per loop 

Так индексирование в NumPy оказался проще и быстрее, для этого примера