Эта статья является частью серии «Наука о данных с нуля - могу ли я».

Щелкните здесь, чтобы перейти к предыдущей статье / лекции на тему« A5: NumPy (Часть 1): массивы, случайный модуль, методы и атрибуты массивов

Привет, ребята!
В предыдущей статье / лекции мы узнали о массивах NumPy, а также о других основных концепциях NumPy. Давайте продолжим и поговорим об индексировании, нарезке, широковещании, необычном индексировании и логическом маскировании. Мы также поговорим об арифметических операциях с массивами NumPy вместе с универсальной функцией (ufuncs) в конце этой статьи.

В массивах NumPy индексы отсчитываются от нуля - первый элемент в строке указывается с помощью «0» - и мы также можем выбрать часть массива, используя индексы. Давайте учиться на практике!

Индексирование и нарезка одномерных массивов (векторов):

Начнем с индексации и нарезки одномерных массивов (векторов) на простом примере.

В простейшем случае выбор одного или нескольких элементов массива NumPy "array_1d" выглядит очень похоже на списки Python.

Подобно спискам Python, мы также можем получить значение из массива NumPy, используя индекс -ve (начинается с -1).

Давайте возьмем диапазон элементов из "array_1d". (использование оператора печати с некоторым текстом очень полезно и считается хорошей практикой программирования)

Мы также можем использовать индекс -ve, чтобы получить диапазон значений / элементов из нашего массива "array_1d"!

Давайте возьмем значения от "array_1d" все до индекса 2 "[:2]" и все из индекса "[2:]". Нам не нужно указывать индексы запуска и остановки, в этом случае они необязательны.

Что, если нам нужно присвоить новое значение определенному индексу в массиве? Это просто!

Обратите внимание, первый элемент изменен на -102. В исходном "array_1d" было -10 (см. Выше)

В случае, если индекса не существует, мы получаем "IndexError". Давайте попробуем большее число, например 305 как индекс (мы знаем, что 305 не входит в индекс "array_1d").

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

Индексирование и нарезка двумерных массивов (матриц):

Давайте создадим массив из 24 элементов с помощью arange() и преобразуем его в 2D-матрицу с помощью shape. (примечание, 6 * 4 = 24)

Теперь из приведенной выше матрицы array_2d мы можем получить всю строку, передав номер строки (начиная с 0).

У нас 6 рядов в array_2d. Давайте возьмем 3-ю строку, используя отрицательный индекс, в этом случае нам нужно передать -4. (Помните, -0 то же самое, что и 0, попробуйте)

К отдельному элементу можно легко получить доступ из 2D-массива, и общий формат: array_2d[row][col] или array_2d[row,col].

Обычно мы используем [row,col], проще использовать запятую ',' для ясности. Итак, давайте возьмем отдельный элемент / значение из row = 5 и column = 2.

Хотите получить кусок 2D-массива? Это просто!

array_2d[0:2,0:2] =>array_2d[from_row_0:till_row_2(2 not included), from_col_0:till_col_2(2 not included)]

Вещание:

Массивы Numpy отличаются от обычных списков Python из-за их способности транслировать. Мы остановимся только на основах, подробнее о правилах вещания читайте здесь. Еще одно хорошее чтение о радиовещании!

Начнем с нескольких простых примеров:

Теперь возьмите срез массива array_1d и установите его равным некоторому числу, например 500. Установка среза на 500 фактически транслирует его выбранным элементам array_1d.

Давайте попробуем трансляцию с 2D-массивом, мы можем использовать np.onec() для создания матрицы 4x4.

Мы можем транслировать массив в другой массив или значение в массиве, используя математический оператор, например. +.

Вот еще один пример трансляции, читайте комментарии, пожалуйста!

Если у вас все еще есть путаница с вещанием, давайте попробуем разобраться в визуальном, а затем на практическом коде!

Теперь наш array_1 - это 1 строка и 3 столбца, а наш array_2 - 1 строка и 1 столбец. Трансляция из массива_2 в массив_1. (источник изображений трансляция)

Теперь давайте рассмотрим трансляцию массива «3 строки и 1 столбец» в массив «3 строки и 3 столбца».

Еще одна, немного сложная концепция, рассмотрим широковещательную передачу массива «3 столбца и 1 строка» в массив «3 строки и 1 столбец».

Надеюсь, концепция трансляции теперь понятна!

Необычное индексирование (полезно знать):

Необычная индексация позволяет нам выбирать целые строки или столбцы в произвольном порядке.
Давайте создадим NumPy array_2d, чтобы увидеть, как он работает! Вы помните, zeros(), range(), shape и broadcasting? давайте пересмотрим эти концепции :)

* array_2d = np.zeros((5,5))
* array_2d[1]=1 # broadcasting 1 to the 2nd row at index 1
* array_2d[2]=2 # broadcasting 2 to the 2nd row at index 2 
* array_2d[3]=3 # broadcasting 3 to the 2nd row at index 3
* array_2d[4]=4 # broadcasting 4 to the 2nd row at index 4
* array_2d # see how the matrix look like!

Этот процесс утомителен!. Вы думаете, что можете использовать цикл for? Хорошо, давайте попробуем цикл for для задач, указанных выше! (Комментарии даны для доработок!)

Замечательная индексация позволяет нам захватить любую строку, используя ее индекс, давайте возьмем строки 1, 2 и 3. Нам нужно передать список необходимых строк в квадратных скобках!

Вот еще один пример необычной индексации: (Прочтите, пожалуйста, комментарии)

Мы можем взять любую случайную строку, попробуйте 2 и 4!

Мы также можем захватить столбцы!

Массивы логических масок:

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

Например:

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

В NumPy логическое маскирование часто является наиболее эффективным способом выполнения задач такого типа.

Начнем с простого примера.

Мы можем применить такие условия, как ›,‹, == и т. Д.

Мы можем создать маску, чтобы отфильтровать четные числа в нашем «array_1d»

Теперь mod_2_mask_id - это наша маска, в операции маскирования , мы просто индексируем логический массив "array_1d", который вернет 1D-массив, заполненный всеми значениями, которые соответствуют условию - все значения в позиции в котором массив масок (mod_2_mask_id) равен "True".

Точно так же в приведенном выше примере у нас есть 2D-массив array_2d и маска mask_mod_2_2d. Основываясь на этой маске, мы можем отфильтровать шансы из нашего array_2d, давайте сделаем это!

Арифметические операции над массивами:

Мы можем выполнять арифметические операции с массивами NumPy.
Давайте учимся на примерах: (прочтите, пожалуйста, комментарии)

Обратите внимание на предупреждение в разделе, есть комментарии!

Давайте возведем массив в квадрат и умножим на некоторое число.

Универсальные функции (ufuncs):

Пора поговорить об универсальных функциях. NumPy имеет ряд встроенных универсальных функций (ufunc). По сути, это просто математические операции, и мы можем использовать их для выполнения конкретной задачи, связанной с функцией, в массиве NumPy.

Давайте учимся на примерах:

NumPy даже имеет встроенные функции для преобразования градуса в радианы и наоборот!

Мы закончили с основами NumPy! Предлагаю сделать быстрый обзор и перейти к упражнениям для практики в следующей статье.

Увидимся на следующей лекции на тему A7: NumPy (Практические упражнения).

Примечание. Этот полный курс, включая видеолекции и записные книжки jupyter, доступен по следующим ссылкам:

О докторе Джунаид Кази:

Доктор. Джунаид Кази - предметный специалист, консультант по науке о данных и машинному обучению. Он тренер по профессиональному развитию, наставник, автор и приглашенный спикер. С ним можно связаться для консультационных проектов и / или повышения квалификации через LinkedIn или ScienceAcademy.ca.