2016-12-07 6 views
1

У меня есть Numpy матрицу, где одна строка, например, выглядит следующим образом:получить то, что оставшиеся после среза с помощью NumPy

|0 1 2 3 4 5 6 7 8| 

я могу получить некоторую часть массива, например. [3,4,5], который мне нужен для одной цели, используя numpy slicing a[0,3:6].

Есть ли что-нибудь встроенное, что позволит мне также получить все, что не в этом диапазоне? Как [0,1,2,6,7,8]

+0

Диапазон по индексу или по значению? С вашим примером мы не можем сказать разницы. – hpaulj

+0

Диапазон указан по индексу, например. позиции 3: 6 –

ответ

3

Один подход с boolean indexing -

a[~np.in1d(np.arange(a.size),r)] 

Пример запуска -

In [174]: a 
Out[174]: array([10, 11, 12, 13, 14, 15, 16, 17, 18]) 

In [175]: r 
Out[175]: [3, 4, 5] 

In [176]: a[~np.in1d(np.arange(a.size),r)] # Without r 
Out[176]: array([10, 11, 12, 16, 17, 18]) 

In [177]: a[r] # With r 
Out[177]: array([13, 14, 15]) 

Другой с integer array indexing -

a[np.setdiff1d(np.arange(a.size),r)] 

Другой способ будет конкатенации ломтики по обе стороны от оригинальный срез -

np.concatenate((a[:r[0]], a[r[-1]+1:])) 
2

В вашем вопросе и примере есть неопределенность. Вы выбираете элементы по значению или индексу? И надо ли принимать slice буквально?

Принимая slice буквально:

In [10]: x=np.arange(10) # stick with the ambiguous input for now 
In [11]: x[3:6] 
Out[11]: array([3, 4, 5]) 

np.delete является удобным инструментом, если выбора элементов по позиции. Это общее назначение, и может использовать slice, а также list входов:

In [13]: np.delete(x,slice(3,6)) 
Out[13]: array([0, 1, 2, 6, 7, 8, 9]) 
In [14]: np.delete(x,[3,4,5]) 
Out[14]: array([0, 1, 2, 6, 7, 8, 9]) 

np.in1d полезен, если вы хотите, чтобы выбрать элементы по значению.

Булевое маскирование также является хорошим инструментом для изучения и использования.

delete использует различные методы в зависимости от входов. Для простого среза я полагаю, что он использует эквивалент:

In [15]: np.concatenate((x[:3],x[6:])) 
Out[15]: array([0, 1, 2, 6, 7, 8, 9]) 
+0

'np.in1d' также можно использовать для выбора по индексу с использованием диапазона индексов. – Divakar

+0

делает 'np.delete' мутировать исходный массив в некоторых случаях? –

+1

'np.delete' возвращает новый массив. Вы не можете удалить элементы из массива на месте. Его размер фиксирован. «Slice» - это представление, но результат «delete» должен быть копией (это непересекающееся подмножество исходных значений). – hpaulj

Смежные вопросы