numpy.lib.stride_tricks.as_strided

numpy.lib.stride_tricks.as_strided(x, shape=None, strides=None, subok=False, writeable=True)

Функция lib.stride_tricks.as_strided() возвращает представление массива с указанной формой и смещением байтов между элементами для перехода по ним вдоль разных осей.

Представление массива не является его копией, т.е. они ссылаются на одни и те же данные, поэтому изменения в одном из них приведут к изменениям в другом.

По сути, данная функция является аналогом функции numpy.reshape (или метода ndarray.reshape), но работающая на более низком уровне. Применение данной функции не рекомендуется даже в официальной документации, так как прямое манипулирование смещением байтов между элементами вдоль осей может привести к самым разным нежелательным последстивиям: от неверного считывания элементов, до самопересекающихся элементов в памяти и т.п.

Параметры:
x - массив NumPy.
Массив из которого необходимо создать представление.
shape - последовательность целых чисел (необязательный параметр).
Форма возвращаемого массива, которая по умолчанию установлен в значение None, что соответствует использованию формы исходного массива x.shape.
strides - последовательность целых чисел (необязательный параметр).
Определяет смещение байтов для перехода на другую ось при обходе элементов возвращаемого массива, по умолчанию установлен в значение None, что соответствует использованию смещения исходного массива x.strides.
subok - True или False (необязательный параметр).
Определяет, то как поступать с подклассами ndarray, если True - то подклассы пропускаются, если False - то все подклассы приводятся к базовому классу ndarray. Доступно в NumPy с версии 1.10.
writeable - True или False (необязательный параметр).
Если установлено значение False то возвращаемое представление исходного массива будет доступно только для чтения, если True то элементы возвращаемого массива могут быть изменены.
Возвращает:
ndarray - представление массива NumPy
представление исходного массива с заданной формой и смещением байтов.
Смотрите так же:
reshape, broadcast_to


Примеры

Давайте создадим массив с множеством осей и посмотрим на смещение байтов для перехода между его элементами вдоль разных осей:

>>> import numpy as np
>>> 
>>> x = np.arange(36).reshape(2, 3, 2, 3)
>>> x
array([[[[ 0,  1,  2],
         [ 3,  4,  5]],

        [[ 6,  7,  8],
         [ 9, 10, 11]],

        [[12, 13, 14],
         [15, 16, 17]]],


       [[[18, 19, 20],
         [21, 22, 23]],

        [[24, 25, 26],
         [27, 28, 29]],

        [[30, 31, 32],
         [33, 34, 35]]]])
>>> 
>>> x.strides
(72, 24, 12, 4)

Глядя на результат команды x.strides становится понятно, что одно целое число занимает 4 байта, т.е. для перехода от числа к числу вдоль последней оси нужно смещаться на 4 байта, подмассивы вдоль третьей оси состоят из трех элементов, тогда для перехода между ними нужно смещаться на 12 байт и т.д. Что ж, если мы хотим создать массив с формой (6, 6), то смещение должно быть (24, 4), давайте проверим:

>>> y = np.lib.stride_tricks.as_strided(x, (6, 6), (24, 4))
>>> y
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

Кажется все получилось, но что если вдруг допущена ошибка и мы указываем неверное количество байтов в strides:

>>> y = np.lib.stride_tricks.as_strided(x, (6, 6), (24, 6))
>>> y
array([[          0,      131072,           3,      327680,           6,             524288],
       [          6,      524288,           9,      720896,          12,             917504],
       [         12,      917504,          15,     1114112,          18,            1310720],
       [         18,     1310720,          21,     1507328,          24,            1703936],
       [         24,     1703936,          27,     1900544,          30,            2097152],
       [         30,     2097152,          33,     2293760, -1406126388,         -726663168]])

Это приводит к неправильному считыванию элементов в памяти.