NumPy в Python. Часть 1
Доброго времени суток, Хабр. Запускаю цикл статей, которые являются переводом небольшого мана по numpy, ссылочка. Приятного чтения.
Введение
Установка
Если у вас есть Python(x, y) (Примечание переводчика: Python(x, y), это дистрибутив свободного научного и инженерного программного обеспечения для численных расчётов, анализа и визуализации данных на основе языка программирования Python и большого числа модулей (библиотек)) на платформе Windows, то вы готовы начинать. Если же нет, то после установки python, вам нужно установить пакеты самостоятельно, сначала NumPy потом SciPy. Установка доступна здесь. Следуйте установке на странице, там всё предельно понятно.
Немного дополнительной информации
Сообщество NumPy и SciPy поддерживает онлайн руководство, включающие гайды и туториалы, тут: docs.scipy.org/doc.
Импорт модуля numpy
Есть несколько путей импорта. Стандартный метод это — использовать простое выражение:
Тем не менее, для большого количества вызовов функций numpy, становится утомительно писать numpy.X снова и снова. Вместо этого намного легче сделать это так:
Это выражение позволяет нам получать доступ к numpy объектам используя np.X вместо numpy.X. Также можно импортировать numpy прямо в используемое пространство имен, чтобы вообще не использовать функции через точку, а вызывать их напрямую:
Однако, этот вариант не приветствуется в программировании на python, так как убирает некоторые полезные структуры, которые модуль предоставляет. До конца этого туториала мы будем использовать второй вариант импорта (import numpy as np).
Массивы
Главной особенностью numpy является объект array. Массивы схожи со списками в python, исключая тот факт, что элементы массива должны иметь одинаковый тип данных, как float и int. С массивами можно проводить числовые операции с большим объемом информации в разы быстрее и, главное, намного эффективнее чем со списками.
Создание массива из списка:
Здесь функция array принимает два аргумента: список для конвертации в массив и тип для каждого элемента. Ко всем элементам можно получить доступ и манипулировать ими так же, как вы бы это делали с обычными списками:
Массивы могут быть и многомерными. В отличии от списков можно использовать запятые в скобках. Вот пример двумерного массива (матрица):
Array slicing работает с многомерными массивами аналогично, как и с одномерными, применяя каждый срез, как фильтр для установленного измерения. Используйте «:» в измерении для указывания использования всех элементов этого измерения:
Метод shape возвращает количество строк и столбцов в матрице:
Метод dtype возвращает тип переменных, хранящихся в массиве:
Тут float64, это числовой тип данных в numpy, который используется для хранения вещественных чисел двойной точности. Так же как float в Python.
Метод len возвращает длину первого измерения (оси):
Метод in используется для проверки на наличие элемента в массиве:
Массивы можно переформировать при помощи метода, который задает новый многомерный массив. Следуя следующему примеру, мы переформатируем одномерный массив из десяти элементов во двумерный массив, состоящий из пяти строк и двух столбцов:
Обратите внимание, метод reshape создает новый массив, а не модифицирует оригинальный.
Имейте ввиду, связывание имен в python работает и с массивами. Метод copy используется для создания копии существующего массива в памяти:
Списки можно тоже создавать с массивов:
Можно также переконвертировать массив в бинарную строку (то есть, не human-readable форму). Используйте метод tostring для этого. Метод fromstring работает в для обратного преобразования. Эти операции иногда полезны для сохранения большого количества данных в файлах, которые могут быть считаны в будущем.
Заполнение массива одинаковым значением.
Транспонирование массивов также возможно, при этом создается новый массив:
Многомерный массив можно переконвертировать в одномерный при помощи метода flatten:
Два или больше массивов можно сконкатенировать при помощи метода concatenate:
Если массив не одномерный, можно задать ось, по которой будет происходить соединение. По умолчанию (не задавая значения оси), соединение будет происходить по первому измерению:
В заключении, размерность массива может быть увеличена при использовании константы newaxis в квадратных скобках:
Заметьте, тут каждый массив двумерный; созданный при помощи newaxis имеет размерность один. Метод newaxis подходит для удобного создания надлежаще-мерных массивов в векторной и матричной математике.
Работа с Matrix в Python
Для работы с Matrix Python нам необходимо импортировать модуль numpy. Матрица используется для операций с матрицей, которая может использоваться для научных целей, обработки изображений и т.д.
Как создать матрицу?
Согласно Википедии, матрица – это прямоугольный массив чисел, символов или выражений, упорядоченный по строкам и столбцам. Итак, в следующем коде мы будем инициализировать различные типы матриц.
Обычно матрица создается с помощью функции numpy.matix(). Мы можем использовать numpy.shape, чтобы узнать размер матрицы. Смотрите следующий пример кода матрицы.
Вы получите результат, как на следующем изображении.

Добавление матрицы
Код для сложения матриц достаточно сложен для написания вручную. Благодаря модулю numpy мы можем просто использовать оператор + для добавления матрицы. Итак, в следующем примере кода мы увидим, как писать код сложения вручную, а также с помощью оператора +.
Умножение и транспонирование матриц, обратная матрица
В предыдущем разделе мы обсудили преимущество Python Matrix в том, что он просто упрощает для нас задачу. Таким образом, мы можем просто умножить две матрицы, получить инверсию и транспонирование матрицы.
Как мы видели ранее, оператор + добавляет две матрицы, здесь мы можем просто использовать оператор * для умножения матриц. При этом количество столбцов в первой матрице должно быть равно количеству строк во второй матрице.
Мы можем получить инверсию матрицы, используя функцию getI() и использовать getT() для транспонирования матрицы. Давайте посмотрим на пример:
Поскольку мы использовали случайные значения. Таким образом, элементы матрицы будут разными. Вывод вышеуказанного кода приведен ниже:
31. Двумерные списки (массивы, матрицы) в Python
Прежде, чем мы сделаем игру «Сапер» и «Блоки» нужно научится работать с двумерными списками.
Если просто, то двумерный список — это таблица. У каждой ячейки таблицы есть номер строки и номер столбца.
Т.е. каждая ячейка имеет не один номер, как в обычном списке, а два: номер строки и номер столбца.
Поэтому такие списки и называют «двумерными». В математике такие структуры называют «матрицы».
Создадим простой двумерный список:
Не очень похоже на таблицу, правда?
А если так:
a[0] — это вся первая строка. Т.е. по сути, это элемент списка, который является списком.
len(a) — количество строк
len(a[0]) — количество элементов (столбцов) в первой строке.
Разумеется, что мы не будем заполнять и выводить это вручную.
Сначала посмотрим на вывод.
Взять все строки по очереди и вывести на экран.
Знакомый прием, правда? Спасибо Питону, он позволяет работать со списками просто и элегантно.
А теперь посмотрим на заполнение:
Начал с k = 10 для того, чтобы все числа были двузначные (попробуйте начать с k = 1 и поймете, о чем я говорю)
Теперь — заполнение случайными значениями:
А теперь создадим очень простой класс и двумерный список, который заполним экземплярами этого класса:
Усложним задачу. Сделаем класс «Ячейка» и нарисуем таблицу ячеек. Вначале класс и тестовая ячейка:
В результате — грустная и одинокая «клетка» на экране. Случайного цвета и со случайным значением.
Мы использовали класс cell, потому что это удобно — «завернуть» несколько параметров в «одну переменную». Без использования класса мы смогли бы хранить только числовое значение в ячейке. А так у нас есть уже, как минимум, два значения — это цвет и числовое значение.
Рассмотрим перебор всех ячеек. Например, приведем в соответствие цвет и значение в ячейке: выделим значения от 0 до 2 голубым, от 3 до 5 зеленым, 6 — 8 — желтым и 9 — красным:
Не работает?
У меня тоже не работает.
Как выяснить, в чем может быть дело?
Вначале стоит проверить, выполняется ли функция task вообще. В этом поможет обычный print(‘!’)
Если выполняется, то так же нужно проверить выполнение какого-либо условия.
Все работает… но изменений-то не видно!
Ключевое слово видно.
Если еще не догадались, то подсказываю: нужно отобразить изменения.
a[r].paint()