Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.Python.8-10.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

Основы Numerical Python

Объект array может быть рассмотрен как вариант списка, но с учетом следующих допущений и возможностей:

  • Все элементы массива представлены одним типом объектов, например целыми, действительными или комплексными числами, что делает их хранение и обработку наиболее эффективным.

  • В тот момент, когда создается массив, число его элементов должно быть известно.

  • Массивы не являются стандартной частью Python — они требуют специального дополнительного пакета, которым пользуются практически все, кто занимаются научными проектами на Python. Этот пакет называется Numerical Python или еще чаще NumPy, поскольку после его установки вызов осуществляется с помощью обычной инструкции импорта модуля: import numpy. Для того, чтобы установить NumPy, загрузите его с официального сайта проекта. На этой же странице вы обнаружите еще один пакет, который нам понадобится в дальнейшем — SciPy.

  • С numpy широкий круг математических операций может быть решен непосредственно с помощью массивов, таким образом исключается потребность в циклах, проходящих по элементам массива. Это свойство носит названия векторизации (vectorization) или прорисовки.

  • Массивы с одним индексом также называют векторами. Массивы с двумя индексами используются для создания матриц и представления табличной информации. Массив может содержать практически любое количество индексов, то есть быть n-мерным.

Как уже было сказано, после установки пакета, работа с модулем происходит обычным образом:

from numpy import *

Конвертирование списка r в массив a происходит привычным способом, но с помощью импортированной из numpy функции:

a = array(r)

Для того, чтобы создать массив из n нулевых элементов используем функцию zeros:

a = zeros(n)

Элементы по умолчанию являются float-объектами, второй аргумент функции позволяет изменить тип объектов, например, на int. Часто бывает нужно создать массив из элементов, равномерно распределенных в интервале [p, q]. Для этого в numpy есть функция linspace:

a = linspace(p, q, n)

Вообще говоря в numpy имеется огромное количество функций и внутренних модулей. Доступ к элементу осуществляется так же как в списках, например, a[1 ]. Срезы тоже здесь работают, например срез a[1:-1], извлекает список всех элементов, кроме первого и последнего. Но в отличие от списка, здесь это не копия. Например:

b = a[1:-1]  b[2] = 0.1

изменится и массив a, его элемент a[3]=0.1.

К слову, о срезах

Срез в формате a[i:j:s] выбирает все элементы, начиная с i, заканчивая, но не включая, j с шагом s. Например, срез a[0:-1:2] выбирает каждый второй элемент, кроме последнего. Как и ранее, возможны пропуски аргументов, например a[::4] выберет каждый четвертый элемент. Можно взять и отрицательный шаг, тогда элементы будут идти в обратном порядке.

Задание координат и значений функций

Теперь, когда у нас есть эти простейшие операции, мы можем продолжить пример, в котором мы использовали списки:

>>> from numpy import *  >>> x2 = array(xlist)  >>> y2 = array(ylist)  >>> x2  array([ 0. ,0.25, 0.5, 0.75, 1.])  >>> y2  array([ 0. , 0.015625, 0.125, 0.421875, 1. ])

Вместо того, чтобы сначала создавать список, а потом конвертировать его в массив будет естественным сразу же создавать массив. Координаты, что мы задавали в xlist легко получить в виде массива с помощью функции linspace. Массив для значений мы создадим с помощью zeros, чтобы ему изначально была правильно отведена длина, в соответствии с числом элементов в xlist. Далее мы заполняем его с помощью цикла:

>>> from numpy import *  >>> n = len(xlist)  >>> x2 = linspace(0, 1, n)  >>> y2 = zeros(n)  >>> for i in xrange(n):  …     y2[i] = f(x2[i]) …  >>> y2  array([ 0. , 0.015625, 0.125, 0.421875, 1. ])

Заметьте, что в цикле мы используем вместо range другую функцию — xrange. Она является более предпочтительной для (обычно больших) массивов. Также отметим, что для y мы использовали генерацию списка, а для y2 — цикл for, поскольку массив это не список. Из положения можно выйти с помощью конвертирования:

>>> x2 = linspace(0, 1, n)

>>> y2 = array([f(xi) for xi in x2])

Тем не менее, есть лучший вариант, который объясняется далее.