Язык программирования Python
Шрифт:
Создание массива
Для создания массива можно использовать функцию array с указанием содержимого массива (в виде вложенных списков) и типа. Функция array делает копию, если ее аргумент — массив. Функция asarray работает аналогично, но не создает нового массива, когда ее аргумент уже является массивом:
Листинг
>>> from Numeric import *
>>> print array([[1, 2], [3, 4], [5, 6]])
[[1 2]
[3 4]
[5 6]]
>>> print array([[1, 2, 3], [4, 5, 6]], Float)
[[ 1. 2. 3.]
[ 4. 5. 6.]]
>>> print array([78, 85, 77, 69, 82, 73, 67], 'c')
[N U M E R I C]
В
Количество размерностей и длина массива по каждой оси называются формой массива (shape). Доступ к форме массива реализуется через атрибут shape:
Листинг
>>> from Numeric import *
>>> a = array(range(15), Int)
>>> print a.shape
(15,)
>>> print a
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
>>> a.shape = (3, 5)
>>> print a.shape
(3, 5)
>>> print a
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
Методы массивов
Придать нужную форму массиву можно функцией Numeric.reshape. Эта функция сразу создает объект–массив нужной формы из последовательности.
Листинг
>>> import Numeric
>>> print Numeric.reshape(«абракадабр», (5, — 1))
[[а б]
[р а]
[к а]
[д а]
[б р]]
В этом примере–1 в указании формы говорит о том, что соответствующее значение можно вычислить. Общее количество элементов массива известно (10), поэтому длину вдоль одной из размерностей задавать не обязательно.
Через атрибут flat можно получить одномерное представление массива:
Листинг
>>> a = array([[1, 2], [3, 4]])
>>> b = a.flat
>>> b
array([1, 2, 3, 4])
>>> b[0] = 9
>>> b
array([9, 2, 3, 4])
>>> a
array([[9, 2],
[3, 4]])
Следует заметить, что это новый вид того же массива, поэтому присваивание значений его элементам приводит к изменениям в исходном массиве.
Функция Numeric.resizeпохожа на Numeric.reshape, но может подстраивать число элементов:
Листинг
>>> print Numeric.resize(«NUMERIC», (3, 2))
[[N U]
[M E]
[R I]]
>>> print Numeric.resize(«NUMERIC», (3, 4))
[[N U M E]
[R I C N]
[U M E R]]
Функция Numeric.zeros порождает массив из одних нулей, а Numeric.ones - из одних
единиц. Единичную матрицу можно получить с помощью функции Numeric.identity(n):Листинг
>>> print Numeric.zeros((2,3))
[[0 0 0]
[0 0 0]]
>>> print Numeric.ones((2,3))
[[1 1 1]
[1 1 1]]
>>> print Numeric.identity(4)
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]]
Для копирования массивов можно использовать метод copy:
Листинг
>>> import Numeric
>>> a = Numeric.arrayrange(9)
>>> a.shape = (3, 3)
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> a1 = a.copy
>>> a1[0, 1] = -1 # операция над копией
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
Массив можно превратить обратно в список с помощью метода tolist:
Листинг
>>> a.tolist
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
Срезы
Объекты–массивы Numeric используют расширенный синтаксис выделения среза. Следующие примеры иллюстрируют различные варианты записи срезов. Функция Numeric.arrayrange является аналогом range для массивов.
Листинг
>>> import Numeric
>>> a = Numeric.arrayrange(24) + 1
>>> a.shape = (4, 6)
>>> print a # исходный массив
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
>>> print a[1,2] # элемент 1,2
9
>>> print a[1,:] # строка 1
[ 7 8 9 10 11 12]
>>> print a[1] # тоже строка 1
[ 7 8 9 10 11 12]
>>> print a[:,1] # столбец 1
[ 2 8 14 20]
>>> print a[-2,:] # предпоследняя строка
[13 14 15 16 17 18]
>>> print a[0:2,1:3] # окно 2x2
[[2 3]
[8 9]]
>>> print a[1,::3] # каждый третий элемент строки 1
[ 7 10]
>>> print a[:,:: — 1] # элементы строк в обратном порядке
[[ 6 5 4 3 2 1]
[12 11 10 9 8 7]
[18 17 16 15 14 13]
[24 23 22 21 20 19]]
Срез не копирует массив (как это имеет место со списками), а дает доступ к некоторой части массива. Далее в примере меняется на 0 каждый третий элемент строки 1:
Листинг
>>> a[1,::3] = Numeric.array([0,0])
>>> print a
[[ 1 2 3 4 5 6]
[ 0 8 9 0 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
В следующих примерах находит применение достаточно редкая синтаксическая конструкция: срез с многоточием (Ellipsis). Многоточие ставится для указания произвольного числа пропущенных размерностей (:,:,…,:):
Листинг
>>> import Numeric
>>> a = Numeric.arrayrange(24) + 1