Язык программирования Python

Срезы


Объекты-массивы 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 >>> a.shape = (2,2,2,3) >>> 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[0,...] # 0-й блок [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]] >>> print a[0,:,:,0] # срез по первой и последней размерностям [[ 1 4] [ 7 10]] >>> print a[0,...,0] # то же, но с использованием многоточия [[ 1 4] [ 7 10]]



Содержание раздела