Самый краткий способ получить дополнительный срез в numpy - PullRequest
2 голосов
/ 21 января 2020

Каков самый краткий (компактный) способ дополнить срез numpy.array? В отличие от предыдущего поста , я не думаю о скорости, но имею в виду простоту использования / удобочитаемость / общность.

В качестве примера возьмем массив A=np.array([1,2,3,4,5,6]). Я ищу дополнение A[start:stop], например, дополнение A[2:4], которое будет "comp of A[2:4]"=array([1,2,3,6]). Я ищу решение, которое работает независимо от типа контента. Таким образом, A может содержать также массивы str и, в идеале, в принципе, любого измерения, для которого также работает обычная операция среза [start: stop].

Не требуя универсальности, я сейчас использую:

def comp(A,start,stop):
    if A.ndim == 1:
        out = np.hstack((A[0:start],A[stop:]))
    else:
        out = np.vstack((A[0:start],A[stop:]))
    return out

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Вот один краткий способ с np.r_ для генерации этих индексов и последующего индексирования во входном массиве -

A[np.r_[:start,stop:len(A)]]
1 голос
/ 21 января 2020

Решение r_, которое предлагает @Divakar, является кратким для numpy, но оно не будет распространяться на другие классы.

In [195]: np.r_[0:2,4:6]                                                                         
Out[195]: array([0, 1, 4, 5])

Оно генерирует список нужных вам индексов сохранить, по существу, concatenate из np.arange(0,2) и np.arange(4,6). Индексирование со списком - advanced indexing, что делает копию.

Вы не можете использовать такой список для индексирования Python list или string. Они могут только индексировать элементы. Чтобы использовать его в списке:

[alist[i] for i in np.r_[0:2,4:6]]

Но списки имеют синтаксис удаления alist[2:4]=[]

Строки не имеют этого, потому что они неизменны.

Более универсальный подход заключается в объединении / объединении двух фрагментов

np.concatenate([arr[0:2], arr[4:6]])
alist[0:2] + alist[4:6]
astr[0:2] + astr[4:6]
np.concatenate([arr[:, 0:2], arr[:, 4:6]], axis=1)

Ваш код hstack/vstack можно свернуть в один с помощью

np.concatenate((A[0:start],A[stop:]),axis=0)

, поскольку вы объединяете фрагменты в первом измерении в обоих случаях .

Дополнение 2d-среза:

arr[2:4, 2:4]

не может быть 2d-массивом. В каждом ряду осталось разное количество элементов.

...