Атрибут strides
Атрибут strides класса ndarray возвращает кортеж,
содержащий количество байтов, которые необходимо пропустить
в памяти, чтобы перейти к следующему элементу вдоль каждой оси.
Для одномерного массива шаг соответствует размеру одного элемента
в байтах. Для многомерных массивов шаг по каждой оси зависит
от порядка расположения элементов (C-style или Fortran-style).
Этот атрибут используется для эффективного доступа к данным
и позволяет выполнять операции без копирования массива.
Синтаксис
arr.strides
Пример
Давайте создадим одномерный массив и посмотрим на его шаги:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
res = arr.strides
print(res)
Результат выполнения кода:
(8,)
Пример
Теперь рассмотрим двумерный массив, созданный по умолчанию (C-style порядок). Шаг по строкам будет больше, чем по столбцам:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
res = arr.strides
print(res)
Результат выполнения кода:
(24, 8)
В данном случае элемент типа int64 занимает 8 байтов.
Шаг по столбцам равен 8 байтам (переход к следующему элементу
в строке). Шаг по строкам равен 24 байтам (переход к следующей
строке, т.е. пропуск 3-х элементов по 8 байтов).
Пример
Изменим порядок расположения элементов на Fortran-style с помощью транспонирования и посмотрим на шаги:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
transposed = arr.T
res = transposed.strides
print(res)
Результат выполнения кода:
(8, 24)
Шаги поменялись местами. Теперь переход по столбцам (первая ось) требует 8 байтов, а переход по строкам (вторая ось) требует 24 байта.
Пример
Атрибут strides можно использовать для вычисления
размера массива в байтах. Перемножим шаги на размерность
соответствующей оси и сложим результаты:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
strides = arr.strides
nbytes = sum((dim - 1) * stride for dim, stride in zip(arr.shape, strides)) + arr.itemsize
print(nbytes)
Результат выполнения кода:
48
Полученное значение совпадает с атрибутом nbytes,
который возвращает общий размер массива в байтах.