В NumPy, как извлечь диапазон из 1d-массива без использования np.s_? - PullRequest
4 голосов
/ 10 июля 2020

Предположим, что массив выглядит так:

a = np.arange(10)

Я бы хотел удалить числа от индекса 2 до 5.

Я могу сделать это так:

a = np.delete(a, np.s_[2:6])

Теперь a содержит [0, 1, 6, 7, 8, 9]. Однако эта функция не поддерживается Numba, и мне нужно скомпилировать этот код с помощью Numba.

Мне нужно было бы sh сделать то же самое, используя только функции «basi c» NumPy (что угодно здесь в порядке: https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html). К сожалению, объект s_ не поддерживается.

Как я могу выполнить sh это? Это нормально, если мне нужно сделать более одного вызова или массивов tmp.

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Я бы не советовал удалять из массива в numpy, так как это может быть медленным (особенно для более длинных массивов, поскольку он копирует). Другой способ - использование масок (не уверен, поддерживает ли numba, стоит попробовать). Если вы можете попробовать выполнить свои операции с маскированным массивом:

b = a[2:6]
#[2 3 4 5]


#Try to do operations on masked array
a = np.ma.array(a, mask=False)
a.mask[2:6] = True
#[0 1 -- -- -- -- 6 7 8 9]

#if you insist on deleting masked elements
a = a.compressed()
#[0 1 6 7 8 9]
1 голос
/ 10 июля 2020

В одну сторону с использованием numpy.arange:

from numba import njit

@njit
def nb_delete(arr, i, j):
    return np.delete(arr, np.arange(i, j))

nb_delete(np.arange(10), 2,6)

Вывод:

array([0, 1, 6, 7, 8, 9])
1 голос
/ 10 июля 2020

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

a = np.arange(10)
a = np.delete(a, slice(2, 6))

Документация для s_ в значительной степени объясняет вам, как это сделать в примечаниях. Одномерный вызов s_ в основном является сокращением для slice.

Использование delete, вероятно, здесь правильный выбор, потому что он распределяет выходные данные более эффективно, чем вручную. начало и конец и сосредоточение.

...