NumPy, часть 2: базовые операции над массивами

Здравствуйте! Я продолжаю работу над пособием по python-библиотеке NumPy.
В прошлой части мы научились создавать массивы и их печатать. Однако это не имеет смысла, если с ними ничего нельзя делать.
Сегодня мы познакомимся с операциями над массивами.
Базовые операции
Математические операции над массивами выполняются поэлементно. Создается новый массив, который заполняется результатами действия оператора.
:1: RuntimeWarning: divide by zero encountered in true_divide
Для этого, естественно, массивы должны быть одинаковых размеров.
File
Также можно производить математические операции между массивом и числом. В этом случае к каждому элементу прибавляется (или что вы там делаете) это число.
NumPy также предоставляет множество математических операций для обработки массивов:
Полный список можно посмотреть здесь.
Многие унарные операции, такие как, например, вычисление суммы всех элементов массива, представлены также и в виде методов класса ndarray.
Индексы, срезы, итерации
Одномерные массивы осуществляют операции индексирования, срезов и итераций очень схожим образом с обычными списками и другими последовательностями Python (разве что удалять с помощью срезов нельзя).
File У многомерных массивов на каждую ось приходится один индекс. Индексы передаются в виде последовательности чисел, разделенных запятыми (то бишь, кортежами):
Когда индексов меньше, чем осей, отсутствующие индексы предполагаются дополненными с помощью срезов:
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, :].
Итерирование многомерных массивов начинается с первой оси:
Однако, если нужно перебрать поэлементно весь массив, как если бы он был одномерным, для этого можно использовать атрибут 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 случая:
Вообще никаких копий
Простое присваивание не создает ни копии массива, ни копии его данных:
Python передает изменяемые объекты как ссылки, поэтому вызовы функций также не создают копий.
Представление или поверхностная копия
Разные объекты массивов могут использовать одни и те же данные. Метод view() создает новый объект массива, являющийся представлением тех же данных.
Срез массива это представление:
Глубокая копия
Метод copy() создаст настоящую копию массива и его данных:
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Как получить столбец матрицы?
borisrozumnuk, спасибо за ответ. Но мне нужно со срезами. И возникает вопрос , почему последовательность a[0][0], a[1][0], a[2][0], . a[7][0] выдаст первый столбец, а a[:][0] - нет? Ведь это одно и то же, насколько я понимаю.
30 окт 2016 в 22:10
вроде как a[:][0] почти равнозначно a[0] . Почти, потому что создается копия a .
30 окт 2016 в 22:14
@borisrozumnuk, понял теперь. Спасибо.
30 окт 2016 в 22:20
Надо умножить матрицу на вектор, в котором все элементы, кроме i-го (номер столбца, который нужно получить) равно нулю, а i-ый равен единице. Результатом такого умножения станет i-й столбец. А студент получит пятёрку за необычное решение с применением алгебры, вместо тупого перебора элементов массива.
Библиотека numpy. Работа с массивами. Слайсы

В статье рассмотрены различные способы получения элементов из массивов типа numpy.ndarray библиотеки numpy .
Если вы читаете эту статью, то, наверное, знаете, зачем нужна библиотека numpy . Если в “двух словах”, то numpy – это библиотека для языка программирования Python , которая предоставляет в распоряжение разработчика инструменты для эффективной работы с многомерными массивами и высокопроизводительные вычислительные алгоритмы.
В этой статье все внимание уделено работе с элементами двумерных массивов. В практике очень часто приходится извлекать из уже готовой матрицы как отдельные элементы, так и целые строки, столбцы или их комбинации, о том, как это делать мы и поговорим.
Для начала импортируем библиотеку numpy .
>>> import numpy as np
Теперь создадим матрицу, с которой будем работать.
>>> m = np.matrix('1 2 3 4; 5 6 7 8; 9 1 5 7') >>> print(m) [[1 2 3 4] [5 6 7 8] [9 1 5 7]]
Получим вот такую таблицу чисел.
Не забывайте, что нумерация строк и столбцов в библиотеки numpy (и в самом Python ) начинается с нуля.
Элемент матрицы с заданными координатами
Извлечем элемент из нашей матрицы с координатами (1, 0), 1 – это номер строки, 0 – номер столбца.
Здесь и далее, элементы, с которыми мы работаем в матрице будут окрашены в оранжевый цвет на соответствующей картинке.
>>> m[1, 0] 5
В приведенной записи, в квадратных скобках указывается номер строки – первой цифрой и номер столбца – второй.
Строка матрицы
Получим вторую строчку матрицы.
>>> m[1, :] matrix([[5, 6, 7, 8]])
Двоеточие означает “все элементы”, в приведенном примере, первый элемент – это номер строки, второй – указание на то, что необходимо взять элементы всех столбцов матрицы.
Столбец матрицы
Извлечем третий столбец матрицы.
>>> m[:, 2] matrix([[3], [7], [5]])
Здесь, также как в предыдущем примере, используется двоеточие. Первый элемент в квадратных скобках означает, что мы возьмем по элементу из каждой строки, которые находится в столбце, указанном во втором элементе.
Часть строки матрицы
Иногда возникает задача взять не все элементы строки, а только часть: рассмотрим пример, когда нам из второй строки нужно извлечь все элементы, начиная с третьего.
>>> m[1, 2:] matrix([[7, 8]])
Запись “ 2:” означает, что начиная с третьего столбца включительно (т.к. нумерация начинается с 0, то третий элемент имеет индекс 2) взять все оставшиеся в ряду элементы .
Часть столбца матрицы
Аналогично предыдущему примеру, можно извлечь только часть столбца матрицы.
>>> m[0:2, 1] matrix([[2], [6]])
В приведенной записи “0:2” означает: взять все элементы столбца начиная с индекса 0, заканчивая индексом 2, но последний элемент в результат не включать.
Непрерывная часть матрицы
Извлечем из заданной матрицы матрицу, располагающуюся так как показано на рисунке ниже.
>>> m[0:2, 1:3] matrix([[2, 3], [6, 7]])
Произвольные столбцы / строки матрицы
Numpy позволяет извлекать произвольный набор столбцов или строк матрицы, строки (столбцы) которые нужно извлечь передаются в виде списка.
>>> cols = [0, 1, 3] >>> m[:, cols] matrix([[1, 2, 4], [5, 6, 8], [9, 1, 7]])
P.S.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Как получить определенный столбец из массива NumPy (с примерами)
Вы можете использовать следующий синтаксис для получения определенного столбца из массива NumPy:
#get column in index position 2 from NumPy array my_array[:, 2]
В следующих примерах показано, как использовать этот синтаксис на практике.
Пример 1: получить один столбец из массива NumPy
В следующем коде показано, как получить один конкретный столбец из массива NumPy:
import numpy as np #create NumPy array data = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) #view NumPy array data array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) #get column in index position 2 data[:, 2] array([ 3, 7, 11])
Если вы хотите получить столбец из массива NumPy и получить его как вектор-столбец , вы можете использовать следующий синтаксис:
#get column in index position 2 (as a column vector) data[:, [2]] array([[ 3], [ 7], [11]])
Пример 2: получение нескольких столбцов из массива NumPy
В следующем коде показано, как получить несколько столбцов из массива NumPy:
import numpy as np #create NumPy array data = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) #view NumPy array data array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) #get columns in index positions 1 and 3 from NumPy array data[:, [1,3]] array([[ 2, 4], [ 6, 8], [10, 12]])
Пример 3: получение столбцов в диапазоне из массива NumPy
В следующем коде показано, как получить столбцы в диапазоне из массива NumPy:
import numpy as np #create NumPy array data = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) #view NumPy array data array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) #get columns in index positions 0 through 3 (not including 3) data[:, 0:3] array([[ 1, 2, 3], [ 5, 6, 7], [ 9, 10, 11]])
Обратите внимание, что последнее значение в диапазоне (в данном случае 3) не включается в возвращаемый диапазон столбцов.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в NumPy: