Разрезать массив, чтобы исключить один элемент

Я хотел бы нарезать массив numpy, чтобы исключить из него один элемент.

Например, вот так:

a = numpy.array([1,2,3,4,5])
b = a[0:1::3:4]
b = [1 2 4 5]

Только то, что это не работает, значит, либо я что-то не так делаю, либо это невозможно.


person John    schedule 09.06.2019    source источник
comment
Тем не менее, вопросы, о которых это якобы дублируется, касаются конкретно продукта целых.   -  person John    schedule 09.06.2019
comment
плохой дубликат: stackoverflow.com/ вопросы/48061508/. Этот плакат не хочет продукта.   -  person hpaulj    schedule 09.06.2019
comment
Есть функция np.delete. Однако внутри он просто соединит два отдельных фрагмента. Вы не можете сделать это только с одним кусочком. Результат должен быть copy, а не view.   -  person hpaulj    schedule 09.06.2019
comment
@hpaulj: я не могу снова голосовать. Пожалуйста, закройте его как дубликат stackoverflow.com/questions/19286657/   -  person Sheldore    schedule 09.06.2019
comment
numpy.delete создает копию, что для меня слишком медленно. На самом деле мне нужно удалить 1 запись из массива с миллионом записей несколько сотен тысяч раз.   -  person John    schedule 09.06.2019
comment
Можете ли вы удалить несколько сотен тысяч элементов за один раз? Например, вы можете установить маску: True для сохраняемых значений, False для удалений, а затем выполнить один логический индекс. Удаление одного элемента за раз не будет эффективным, даже со списками.   -  person hpaulj    schedule 09.06.2019


Ответы (3)


Если вы собираетесь неоднократно «удалять» один элемент за раз, я бы предложил использовать логическую маску:

In [493]: a = np.arange(100)                                                                           
In [494]: mask = np.ones(a.shape, dtype=bool)                                                          
In [495]: for i in [2,5,9,20,3,26,40,60]: 
     ...:     mask[i]=0 
     ...: a1 = a[mask]                                                                                 
In [496]: a1.shape                                                                                     
Out[496]: (92,)

Это фактически то, что np.delete делает, когда дается список или массив удалений

In [497]: a2 = np.delete(a, [2,5,9,20,3,26,40,60])                                                     
In [498]: np.allclose(a1,a2)                                                                           
Out[498]: True

Для одного элемента объединяются два слайса - либо путем конкатенации, либо путем копирования в массив result нужного размера. Во всех случаях мы должны создать новый массив.

Одно исключение или много, вы ищете прерывистый выбор элементов оригинала. Этого нельзя добиться с помощью view, который использует shape и strides для выбора обычного подмножества оригинала.

person hpaulj    schedule 09.06.2019
comment
Я понимаю, что это выходит за рамки моего первоначального вопроса, но после первой маски мне нужно сделать еще несколько, например. удалить другие элементы из массива. Это означает, что мне нужно каждый раз создавать новую маску, не так ли? Кроме того, я также изменяю массив на каждом шаге, поэтому маскирование исходного массива маской с несколькими нулями также не работает. - person John; 09.06.2019
comment
Что еще вы делаете с массивом? Я не уверен, что массивы numpy - это правильная структура данных для вас. - person hpaulj; 09.06.2019

Вам нужно сделать что-то вроде ниже

 a =  np.array([1,2,3,4,5])
 b = a[:2]
 c = a[3:]
 print ( b )
 print ( c )
 z= np.concatenate((b,c),axis=None)
 print ( z )

Output:
[1 2]
[4 5]
[1 2 4 5]

Следовательно, здесь все, кроме 3, находится в новом numpy.ndarray z здесь. Другой способ - использовать функцию np.delete, как показано в одном из ответов, где вы можете указать список индексов, которые нужно удалить внутри [], где список содержит индекс, разделенный запятыми, который нужно удалить.

   a =  np.array([15,14,13,12,11])
   a4=np.delete(a,[1,4])
   print(a4)

   output is :
   [15 13 12]
person Invictus    schedule 09.06.2019

Вы всегда можете использовать наборы нарезки

b = a[:2]+a[3:]

Вернется [1, 2, 4, 5]

для возвращаемого значения numpy вы можете сделать 2 среза и объединить результаты.

 b = a[3:]
 c = a[:2]
 numpy.concatenate([c,b])

Вернется

array([1, 2, 4, 5])
person BillyN    schedule 09.06.2019
comment
Из ваших возвращенных данных похоже, что вы используете список Python, а не массив numpy. Это так? - person Rory Daulton; 09.06.2019
comment
+ — это соединение для списков, но не для массивов. - person hpaulj; 09.06.2019
comment
Моя единственная проблема заключается в том, что конкатенация имеет ту же сложность, что и удаление, и мне нужно делать это много раз на больших массивах. - person John; 09.06.2019