Срезы

Объекты–массивы 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]]

Больше книг — больше знаний!

Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ