Как сделать из матрицы вектор numpy

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Списки - встроенный тип Python, могут содержать любые элементы: целые, дробные числа, строки, объекты. Это великая сила Python, но в то же время и слабость — в отношении скорости работы.

В стандартные дистрибутивы Python входит модуль array, реализующий аналог массивов C/C++, он может пригодиться для простейших расчётов с многомерными массивами, матрицами.

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

Матрица в NumPy — это объект numpy.array, массив чисел одного типа, какой угодно размерности: 0 (одно число, скаляр), 1 (вектор), 2 (матрица), 3 (тензор третьего ранга).

Матрицы во многом похожи на списки и массивы модуля array: поддерживают индексацию с таким же синтаксисом и легко преобразуются в них.

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

ABC*D + E, где B,C — матрицы 2x2, D,E — вектор-столбцы, A — скаляр (число).

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

А если речь идёт о матрицах 10x10? Трёхмерных, четырёхмерных? С комплексными числами? И даже с произвольными объектами вместо чисел (если определить арифметические действия над ними)?

Матрица — это двухмерная структура данных, в которой числа расположены в виде строк и столбцов. Например:


Эта матрица является матрицей три на четыре, потому что она состоит из 3 строк и 4 столбцов.

Матрицы в Python

Python не имеет встроенного типа данных для матриц. Но можно рассматривать список как матрицу. Например:

Этот список является матрицей на 2 строки и 3 столбца.

Обязательно ознакомьтесь с документацией по спискам Python , прежде чем продолжить читать эту статью.

Давайте посмотрим, как работать с вложенным списком.

Использование вложенных списков в качестве матрицы подходит для простых вычислительных задач. Но в Python есть более эффективный способ работы с матрицами – NumPy .

NumPy массивы в Python

NumPy — это расширение для научных вычислений, которое поддерживает мощный объект N-мерного массива. Прежде чем использовать NumPy, необходимо установить его. Для получения дополнительной информации,

  • Ознакомьтесь: Как установить NumPy Python?
  • Если вы работаете в Windows, скачайте и установите дистрибутив anaconda Python. Он поставляется вместе с NumPy и другими расширениями.

После установки NumPy можно импортировать и использовать его.

NumPy предоставляет собой многомерный массив чисел (который на самом деле является объектом). Давайте рассмотрим приведенный ниже пример:

Как видите, класс массива NumPy называется ndarray.

Как создать массив NumPy?

Существует несколько способов создания массивов NumPy.

Массив целых чисел, чисел с плавающей точкой и составных чисел

Когда вы запустите эту программу, результат будет следующий:

Массив нулей и единиц

Здесь мы указали dtype — 32 бита (4 байта). Следовательно, этот массив может принимать значения от -2 -31 до 2 -31 -1.

Использование arange() и shape()

Узнайте больше о других способах создания массива NumPy .

Операции с матрицами

Выше мы привели пример сложение, умножение матриц и транспонирование матрицы. Мы использовали вложенные списки, прежде чем создавать эти программы. Рассмотрим, как выполнить ту же задачу, используя массив NumPy.

Сложение двух матриц или сумма элементов массива Python

Мы используем оператор +, чтобы сложить соответствующие элементы двух матриц NumPy.

Умножение двух матриц Python

Чтобы умножить две матрицы, мы используем метод dot(). Узнайте больше о том, как работает numpy.dot .

Примечание: * используется для умножения массива (умножения соответствующих элементов двух массивов), а не умножения матрицы.

Транспонирование матрицы питон

Мы используем numpy.transpose для вычисления транспонирования матрицы.

Как видите, NumPy значительно упростил нашу задачу.

Доступ к элементам матрицы, строкам и столбца

Доступ к элементам матрицы

Также можно получить доступ к элементам матрицы, используя индекс. Начнем с одномерного массива NumPy.

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

Доступ к строкам матрицы

Доступ к столбцам матрицы

Разделение матрицы

Разделение одномерного массива NumPy аналогично разделению списка. Рассмотрим пример:

Теперь посмотрим, как разделить матрицу.

Использование NumPy вместо вложенных списков значительно упрощает работу с матрицами. Мы рекомендуем детально изучить пакет NumPy, если вы планируете использовать Python для анализа данных.

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

Пожалуйста, оставьте ваши отзывы по текущей теме материала. За комментарии, дизлайки, подписки, отклики, лайки низкий вам поклон!

NumPy - библиотека для научных вычислений (обработки набора чисел). Работает с многомерными массивами (матрицами).

import numpy

Для работы с функциями numpy нужно импортировать библиотеку

Все примеры ниже приводятся в интерпретаторе питона. Он запускается из командной строки ipython

Не забывайте в начале работы писать import numpy as np

Термины

numpy работает с однородными многомерными массивами (матрицами). Это матрица из элементов одинакового типа (обычно чисел).

В numpy размерность называют осями (axes). Количество осей - ранг.


Например, координаты точки в 3D пространстве [1, 2, 1] это м ранга 1, так как 1 ось. Это ось длины 3.

Массив ниже имеет ранг 2 (он двумерный). Первая ось длины 2 (в нем две строки), вторая ось длины 3 (в нем 3 столбца)

ndarray

Массив numpy реализован в классе np.ndarray

Характеристики массива a = np.array([[1, 2, 3], [4, 5, 6]]):

типы данных

a.astype(тип) - сделать новый массив с типом элементов тип

Основные численные типы данных numpy (т.е. в таблице np.int и np.int32):

Создание массива

Массив можно сделать:

  • из другой структуры python (список, кортеж и других)
  • специальными функциями создания (arange, ones, zeros и другие)
  • из файла (специальный формат)
  • из байт (из строки или буфера)
  • специальными функциями (random)

Создаем массив из объектов python функцией array

Можно использовать list [], tuple () и их комбинации.

Mesh-grid Arrays

Эти массивы вы использовали для построения 3D графиков.

Создание характерных массивов

В любой функции можно еще указать dtype.

Массив случайных чисел

равномерное распределение, float

np.random.random_sample(shape) возвращает равномерно распределенные случайные числа на [0, 1)

Одномерный массив

Многомерные массивы

К каждой оси применимы правила для одномерных массивов.

Срез выбирает часть массива. Можно изменить часть массива через срез.

Из массива А сделали массив В. В элементы массива В записали новые значения. Но это изменило сам массив А. То есть оба массива расположены в той же памяти компьютера.

Массив В смотрит на те же данные, что и массив А.

Если нужно, чтобы в массиве В была копия данных, нужно использовать функцию copy

массив Numpy

Первое знакомство с библиотекой NumPy (Numerical Python) состоялось на двенадцатом занятии вводного курса. Затем мы несколько раз использовали эту библиотеку при построении моделей. Пришло время посвятить ее функционалу отдельный раздел.

Библиотека Numpy является основой для многих других библиотек в Питоне, например, Pandas, Matplotlib, scikit-learn или scikit-image. Главный объект библиотеки — массив Numpy (Numpy array). О нем мы поговорим сегодня.

На следующем занятии мы изучим математические операции над массивами, а через одно — рассмотрим работу со случайными числами.

Понятие массива Numpy

Массив Numpy — это многомерный массив (ndarray, n-dimensional array) данных, над которыми можно быстро и эффективно выполнять множество математических, статистических, логических и других операций.

Приведу пример массива с нулевым измерением, а также одно-, двух- и трехмерного массивов.

пример массива Numpy с нулевым измерением, а также одно-, двух- и трехмерного массивов.

Теперь посмотрим как работать с этими массивами на практике.

Вначале нужно импортировать библиотеку Numpy.

Как создать массив Numpy

Рассмотрим два варианта создания одномерного массива.

Функция np.array()

Во-первых, массив можно создать с помощью функции np.array(), которой мы передаем, например, список или кортеж элементов.

Функция np.arange()

Кроме того, можно воспользоваться функцией np.arange(). Эта функция, как и функция range(), с которой мы уже знакомы, создает последовательность элементов. Обязательным параметром является верхняя граница, которая не входит в последовательность.

Нижняя граница и шаг обязательными не являются.

Отличие range() от функции np.arange() заключается в том, что первая не допускает использования типа float.

ошибка: значение типа float в списке

При этом в массиве Numpy тип float вполне может использоваться.

Тип данных элементов массива

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

Обратите внимание, в отличие, например, от списков, чаще всего в массивах содержатся элементы только одного типа (в частности, int или float).

Свойства (атрибуты) массива

Возьмем массив, который мы создали выше.

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

Теперь, с помощью атрибута shape, посмотрим на количество элементов в каждом измерении.

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

Атрибут size показывает общее количество элементов во всех измерениях.

Как уже было сказано выше, атрибут dtype показывает тип данных отдельного элемента.

Атрибут itemsize позволяет узнать размер в байтах (один байт состоит из 8 бит) одного элемента. В нашем случае, элемент (число) состоит из 64 бит, что составляет восемь байтов.

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

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

Измерения массива

Как уже было сказано, ndarray (массив Numpy) — это многомерный массив. Давайте еще раз взглянем на массивы с различными измерениями, добавив только что изученные атрибуты этих массивов.

нулевой массив, одно-, двух- и трехмерный массивы и их атрибуты

Теперь подробнее поговорим про размерность. Измерения (dimensions) создаются за счёт вложения одного массива в другой с помощью квадратных скобок []. Начнем с массива с нулевой размерностью.

Массив с нулевой размерностью

Массив с нулевой размерностью — это число (скаляр) и квадратных скобок не имеет.

Посмотрим на свойства этого массива.

Атрибут shape показывает отсутствие размерности, а size указывает на один элемент в массиве.

Одномерный массив (вектор)

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

Снова воспользуемся атрибутами массива.

Двумерный массив (матрица)

Поместив во вторые квадратные скобки, например, два одномерных массива, мы получим двумерный массив или матрицу.

Посмотрим на свойства.

Атрибут size двумерного массива более интуитивно понятен. В данном случае два элемента одного измерения умножены на три элемента второго.

Добавлю, что с точки зрения Numpy матрица с одной строкой или одним столбцом — это разные объекты. Начнем с матрицы, которая имеет три вектора по одному элементу.

Теперь наоборот, создадим матрицу с одной строкой, в которой три элемента.

Трехмерный массив

Теперь создадим трехмерный массив, внутри которого будут два двумерных массива 2 х 3. Общее количество элементов будет равно двенадцати (2 х 2 х 3). Визуально это можно представить как стэк (наложение) двух матриц.

пример трехмерного массива и атрибут shape

При этом, вместо того чтобы вручную прописывать все 12 значений, мы последовательно воспользуемся функцией np.arange() и методом np.reshape().

Функция np.arange(), как мы уже видели выше, создаст одномерный массив из 12 элементов, а метод np.reshape() распределит их по измерениям. Выведем атрибуты.

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

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

Понятие тензора

Добавлю, что в математике n-мерный массив называется тензором, а числа (скаляры), векторы и матрицы являются его частными случаями для нуля, одного и двух измерений соответственно.

виды тензоров: скаляр, вектор, матрица

Другие способы создания массива

Массив из нулей

Иногда бывает полезно создать массив, все элементы которого равны нулю. Для этого используется функция np.zeros().

Массив из единиц

В тех случаях когда нужно создать массив, заполненный единицами, можно воспользоваться функцией np.ones().

Массив, заполненный заданным значением

Функция np.full() создает массив, заполненный заданным значением.

Пустой массив Numpy

В отличие от предыдущих инструментов, функция np.empty() возвращает массив заданной размерности, но без инициализации его значений. Другими словами, пустой массив.

Кроме того, любой массив Numpy можно преобразовать в описанные выше массивы с помощью функций np.zeros_like(), np.ones_like(), np.full_like() и np.empty_like(). Приведу пример для np.zeros_like().

Примеры работы с тремя оставшимися функциями можно посмотреть в ноутбуке⧉.

Функция np.linspace()

Функция np.linspace() позволяет указать диапазон начального и конечного значений, а также количество равноудаленных точек внутри этого диапазона (включая начальное и конечное значения).

Обратите внимание, функция np.linspace() сама определяет, где расставить точки. Нам нужно лишь указать их количество. Этим она отличается от функции np.arange(), в которой мы указываем шаг в пределах заданного диапазона.

Функцию np.linspace() удобно использовать для построения графиков функций.

парабола, созданная с помощью функции np.linspace()

В качестве примера выведем первые 10 точек, созданные функцией np.linspace().

Функции np.random.rand() и np.random.randint()

Массивы можно также создавать с помощью функций, генерирующих псевдослучайные числа. В частности, функция np.random.rand() создает массив заданной размерности, заполненный числами от 0 до 1 (единица в диапазон не входит).

Функция np.random.randint() формирует массив целых чисел в заданном диапазоне (верхняя граница не входит в диапазон) и с заданной размерностью.

Более подробно с этими и другими похожими функциями мы познакомимся на одиннадцатом занятии.

Создание массива из функции

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

координаты элементов массива Numpy

Функция np.fromfunction() берет координаты (i, j) каждой ячейки и передает их в собственную функцию. Посмотрим, как это работает на практике.

Теперь применим эту функцию к каждой ячейке (координатам) массива с размерностью (3, 3).

В np.fromfunction() можно передать и lambda-функцию.

Матрица csr и метод .toarray()

Кроме этого в случае если данные хранятся в формате csr (сжатое хранения строкой, compressed sparse row), то мы можем преобразовать их обратно в массив Numpy с помощью метода .toarray().

A = np . array ( [ [ 2 , 0 , 0 , 1 , 0 , 0 , 0 ] , [ 0 , 0 , 3 , 0 , 0 , 2 , 0 ] , [ 0 , 0 , 0 , 1 , 0 , 0 , 0 ] ] )

Долю нулевых значений несложно посчитать через функцию np.count_nonzero() и атрибут size.

Преобразуем матрицу в формат csr.

Вернем матрицу csr обратно в формат массива Numpy.

Напомню, что с форматом csr мы впервые познакомились, когда изучали рекомендательные системы. Метод .toarray() мы активно применяли на занятии по обработке естественного языка.

Индексы и срезы

Индекс элемента массива

Подобно спискам, к элементам массива можно получить доступ по их индексу. Главное отличие — необходимо учитывать наличие измерений. Вначале рассмотрим индексы массива на схеме.

двумерный массив и индекс его элементов

Если мы хотим получить доступ к элементу массива, то необходимо вначале указать индекс внешнего измерения (оно будет первым по счету в выводе атрибута shape), а затем индекс внутреннего.

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

Посмотрим, как это реализовать на Питоне. Создадим двумерный массив.

Посмотрим на измерения и количество элементов в каждом из них.

Выведем первый элемент первого (внешнего) измерения.

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

Теперь выведем значение шесть.

Срез массива

В массиве Numpy доступны и срезы (slice). Срез одномерного массива очень похож на срез списка.

Возьмем каждый второй элемент в интервале с 1-го по 6-й индекс.

Посмотрим на схему.

срез массива Numpy

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

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

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

С помощью среза можно вывести конкретный элемент массива.

Другими словами, c [ 0 , 0 ] == c [ 0 ] [ 0 ] .

Кроме того, обратите внимание, что индекс в формате array[i, j] и координаты элементов массива, которые мы рассмотрели ранее, это одно и то же.

Допускаются срезы с отрицательным индексом.

Рассмотрим более сложный пример. Возьмем всю вторую строку [ 1 ] и каждый второй столбец [ :: 2 ] .

Теперь создадим массив с тремя измерениями.

Можно сказать, что наш 3D массив состоит из четырех матриц 2 x 2.

Вначале выведем значение десять. Если идти снаружи вовнутрь, получается, что это третья матрица [2], второй вектор [1] и первый элемент [0].

Для срезов понадобится две запятых.

Если указать только один срез, мы будем работать только во внешнем измерении (с четырьмя матрицами).

Прежде чем завершить разговор про срезы, выведем первые строки каждой матрицы.

Оси массива

С концепцией измерения массива тесно связано понятие оси (axis, множественное число — axes). У массива столько же осей, сколько и измерений. Мы уже столкнулись с осями двух и трехмерного массивов, когда работали с изображениями.

Рассмотрим этот вопрос ещё раз.

Массив 2D

В двумерном массиве два измерения и соответственно две оси.

оси двумерного массива

В документации Numpy существует такое понятие как первая и последняя ось. Применительно к двумерному массиву, ось 0 — это первая ось, а ось 1 — последняя.

Многие, в частности, математические и статистические методы в Numpy предполагают указание параметра оси. Продолжим работу с приведенным выше двумерным массивом.

Сложение вдоль первой оси (axis = 0)

Найдем сумму по столбцам (вдоль оси 0).

сложение элементов двумерного массива вдоль оси 0

Сложение вдоль второй оси (axis = 1)

Теперь найдем сумму по строкам (вдоль оси 1).

сложение элементов двумерного массива вдоль оси 1

Обратите внимание, хотя axis = 0 принято ассоциировать со строками двумерного массива, сложение происходит вдоль вертикальной оси или по столбцам. Параметр axis = 1, отвечающий за столбцы, наоборот предполагает сложение вдоль горизонтальной оси по строкам.

При таких операциях говорят, что мы агрегируем (aggregate) данные и сворачиваем (collapse) или сокращаем (reduce) измерения вдоль определенной оси. И действительно, в каждой из описанных выше операций двумерный массив превратился в одномерный.

Сложение вдоль обеих осей (axis = (0, 1))

Если в параметр axis передать кортеж с указанием обеих осей (0, 1), сумма будет рассчитана сначала вдоль оси 0, затем вдоль оси 1.

Читайте также: