Numpy удалить элемент из массива

Здравствуйте! Я продолжаю работу над пособием по python-библиотеке NumPy.

В прошлой части мы научились создавать массивы и их печатать. Однако это не имеет смысла, если с ними ничего нельзя делать.

Сегодня мы познакомимся с операциями над массивами.

Базовые операции

Математические операции над массивами выполняются поэлементно. Создается новый массив, который заполняется результатами действия оператора.

Для этого, естественно, массивы должны быть одинаковых размеров.

Также можно производить математические операции между массивом и числом. В этом случае к каждому элементу прибавляется (или что вы там делаете) это число.

NumPy также предоставляет множество математических операций для обработки массивов:

Полный список можно посмотреть здесь.

Многие унарные операции, такие как, например, вычисление суммы всех элементов массива, представлены также и в виде методов класса ndarray.

По умолчанию, эти операции применяются к массиву, как если бы он был списком чисел, независимо от его формы. Однако, указав параметр axis, можно применить операцию для указанной оси массива:

Индексы, срезы, итерации

Одномерные массивы осуществляют операции индексирования, срезов и итераций очень схожим образом с обычными списками и другими последовательностями Python (разве что удалять с помощью срезов нельзя).

У многомерных массивов на каждую ось приходится один индекс. Индексы передаются в виде последовательности чисел, разделенных запятыми (то бишь, кортежами):

Когда индексов меньше, чем осей, отсутствующие индексы предполагаются дополненными с помощью срезов:

b[i] можно читать как b[i, ]. В NumPy это также может быть записано с помощью точек, как b[i, . ].

Например, если x имеет ранг 5 (то есть у него 5 осей), тогда

  • x[1, 2, . ] эквивалентно x[1, 2, :, :, :],
  • x[. , 3] то же самое, что x[:, :, :, :, 3] и
  • x[4, . , 5, :] это x[4, :, :, 5, :].
Читайте также:  400 Вольт в розетке

Итерирование многомерных массивов начинается с первой оси:

Однако, если нужно перебрать поэлементно весь массив, как если бы он был одномерным, для этого можно использовать атрибут flat:

Манипуляции с формой

Как уже говорилось, у массива есть форма (shape), определяемая числом элементов вдоль каждой оси:

Форма массива может быть изменена с помощью различных команд:

Порядок элементов в массиве в результате функции ravel() соответствует обычному "C-стилю", то есть, чем правее индекс, тем он "быстрее изменяется": за элементом a[0,0] следует a[0,1]. Если одна форма массива была изменена на другую, массив переформировывается также в "C-стиле". Функции ravel() и reshape() также могут работать (при использовании дополнительного аргумента) в FORTRAN-стиле, в котором быстрее изменяется более левый индекс.

Метод reshape() возвращает ее аргумент с измененной формой, в то время как метод resize() изменяет сам массив:

Если при операции такой перестройки один из аргументов задается как -1, то он автоматически рассчитывается в соответствии с остальными заданными:

Объединение массивов

Несколько массивов могут быть объединены вместе вдоль разных осей с помощью функций hstack и vstack.

hstack() объединяет массивы по первым осям, vstack() — по последним:

Функция column_stack() объединяет одномерные массивы в качестве столбцов двумерного массива:

Аналогично для строк имеется функция row_stack().

Разбиение массива

Используя hsplit() вы можете разбить массив вдоль горизонтальной оси, указав либо число возвращаемых массивов одинаковой формы, либо номера столбцов, после которых массив разрезается "ножницами":

Функция vsplit() разбивает массив вдоль вертикальной оси, а array_split() позволяет указать оси, вдоль которых произойдет разбиение.

Копии и представления

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

Читайте также:  Lenovo гарантия по серийному номеру

Вообще никаких копий

Простое присваивание не создает ни копии массива, ни копии его данных:

Python передает изменяемые объекты как ссылки, поэтому вызовы функций также не создают копий.

Представление или поверхностная копия

Разные объекты массивов могут использовать одни и те же данные. Метод view() создает новый объект массива, являющийся представлением тех же данных.

Срез массива это представление:

Глубокая копия

Метод copy() создаст настоящую копию массива и его данных:

Один интересный вопрос:

Я хотел бы удалить некоторые элементы из массива numpy, но так же, как ниже, упрощенный примерный код, он работает, если не удалял последний элемент, но это сбой, если мы хотим удалить последний элемент. Ниже код работает нормально:

Если мы изменим только 4 на 5, то он потерпит неудачу:

Сообщение об ошибке:

Почему эта ошибка возникает только при удалении последнего элемента? какой правильный способ выполнять такие задачи?

Имейте в виду, что np.delete(arr, ind) удаляет элемент с индексом ind НЕ тот, у кого это значение.

Это означает, что при удалении вещей массив становится короче. Итак, вы начинаете с

Одним из способов решения проблемы является сортировка индексов, которые вы хотите удалить в порядке убывания (если вы действительно хотите удалить массив).

Вероятно, более быстрый способ (потому что вам не нужно удалять каждое отдельное значение, но все сразу) использует булевскую маску:

Рекомендуется использовать ссылку numpy на np.delete

На ваш вопрос: вы удаляете один элемент, чтобы массив становился короче, а индекс 5 больше не находился в массиве, потому что прежний индекс 5 теперь имеет индекс 4. Удалите в порядке убывания, если вы хотите использовать np.delete.

Если вы действительно хотите удалить с помощью np.delete , используйте стенографию:

Читайте также:  Чем отличается система от структуры

Если вы хотите удалить, где находятся значения (а не индекс), вам нужно немного изменить процедуру. Если вы хотите удалить все значения 5 в своем массиве, вы можете использовать:

или с несколькими значениями для удаления:

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

У меня есть массив numpy, и я хочу удалить первые 3 элемента массива. Я пробовал это решение:

Это дает мне ошибку, что " ValueError: невозможно удалить элементы массива ". Я не понимаю, почему это так. я был бы благодарен за помощь!

2 ответа

10 Решение Björn Pollex [2011-08-21 19:16:00]

Массивы Numpy имеют фиксированный размер, поэтому вы не можете просто удалить элемент из них. Самый простой способ добиться того, что вы хотите, — использовать нарезку:

Это создаст новый массив, начинающийся с 4-го элемента исходного массива.

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

В принципе, a[[1,4,5]] вернет массив, состоящий из элементов 1,4 и 5 исходного массива.

1 Neil G [2011-08-21 19:16:00]

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