2014-01-04 4 views
6

Я хочу удалить некоторые записи из массива numpy длиной около миллиона записей.Удаление определенных элементов из массива numpy с использованием условных проверок

Этот код будет делать это, но займет много времени:

a = np.array([1,45,23,23,1234,3432,-1232,-34,233]) 
for element in a: 
    if element<(-100) or element>100: 
     some delete command. 

Могу ли я сделать это по-другому?

+1

как может быть < -100 and > 100? Предполагаю, вы имеете в виду или? – qwwqwwq

+0

отредактировал, спасибо! –

ответ

9

Я предполагаю, что вы имеете в виду a < -100 or a > -100, самый краткий способ заключается в использовании логической индексации.

a = a[(a >= -100) & (a <= 100)] 

Это не совсем «удаление» записи, а сделать копию массива минус ненужных значений и присваиваем его переменной, которая была ранее присвоенного старого массива. После этого старый массив не имеет оставшихся ссылок и собирает мусор, что означает, что его память освобождается.

Стоит отметить, что этот метод не использует постоянную память, так как мы делаем копию массива, он использует память, линейную по размеру массива. Это может быть плохо, если ваш массив настолько огромен, что он достигает пределов памяти на вашем компьютере. Процесс фактического прохождения и удаления каждого элемента в массиве «на месте», также использующего постоянную память, будет совсем другой операцией, так как элементы в массиве должны быть заменены и блок памяти изменен. Я не уверен, что вы можете сделать это с помощью numpy массива, однако одна вещь, которую вы можете сделать, чтобы избежать копирования является использование numpy замаскированную массив:

import numpy.ma as ma 
mx = ma.masked_array(a, mask = ((a < -100) | (a > 100))) 

Все операции на замаскированного массива будет действовать, как если бы элементы мы «удалили» не существует, но мы действительно не «удалили» их, они все еще там в памяти, есть только запись о том, какие элементы пропускать теперь связаны с массивом, и нам никогда не нужно сделать копию массива в памяти. Кроме того, если мы когда-либо хотим, чтобы наши удаленные значения обратно, можно просто удалить маску, как так:

mx.mask = ma.nomask 
+0

Я пробовал ваш код, но он сохраняет нежелательные номера (> 100 или <-100). Мне нужно удалить эти числа. –

+1

да извините, неправильно прочитал его, я перевернул операторы около – qwwqwwq

+1

. Обратное значение 'a < -100 or a > -100' -' a> = -100 и <= 100'. См. [Законы Де Моргана] (http://en.wikipedia.org/wiki/De_Morgan's_laws). – falsetru

5

Вы можете использовать masked index с обратным условием.

>>> a = np.array([1,45,23,23,1234,3432,-1232,-34,233]) 

>>> a[~((a < -100) | (a > 100))] 
array([ 1, 45, 23, 23, -34]) 

>>> a[(a >= -100) & (a <= 100)] 
array([ 1, 45, 23, 23, -34]) 

>>> a[abs(a) <= 100] 
array([ 1, 45, 23, 23, -34]) 
+0

это обратное подмножество элементов, необходимых OP – qwwqwwq

+0

@qwwqwwq, OP хочет ** удалить ** их; должно инвертировать условие. – falsetru

+0

ах, кричит, неправильно прочитал это – qwwqwwq

2
In [140]: a = np.array([1,45,23,23,1234,3432,-1232,-34,233]) 

In [141]: b=a[(-100<=a)&(a<=100)] 

In [142]: b 
Out[142]: array([ 1, 45, 23, 23, -34]) 
Смежные вопросы