Атрибут flags
Атрибут flags объекта ndarray возвращает объект, содержащий флаги, описывающие свойства памяти массива. Он предоставляет информацию о том, является ли массив непрерывным (C-style или Fortran-style), доступен ли он для записи, выровнены ли данные, а также другие важные характеристики. Эти флаги полезны при оптимизации производительности и понимании того, как NumPy работает с данными.
Синтаксис
arr.flags
Основные флаги
Рассмотрим основные флаги, доступные через атрибут flags:
- ⁅b⁆C_CONTIGUOUS (C)⁅/b⁆ - массив расположен в памяти в порядке C (по строкам). Это означает, что элементы последней оси идут подряд в памяти.
- ⁅b⁆F_CONTIGUOUS (F)⁅/b⁆ - массив расположен в памяти в порядке Fortran (по столбцам).
- ⁅b⁆OWNDATA (O)⁅/b⁆ - массив владеет своими данными, то есть не является представлением (view) другого массива.
-
⁅b⁆WRITEABLE (W)⁅/b⁆ - массив доступен для записи. Если этот флаг установлен в
False, массив нельзя изменять. - ⁅b⁆ALIGNED (A)⁅/b⁆ - данные массива выровнены в памяти, что может ускорить доступ к ним.
- ⁅b⁆WRITEBACKIFCOPY (X)⁅/b⁆ - массив является копией, и при его удалении изменения будут записаны обратно в исходный массив.
Пример
Давайте создадим массив и посмотрим на его флаги:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.flags)
Результат выполнения кода:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
Массив создан с помощью функции array, поэтому он расположен в порядке C, владеет своими данными и доступен для записи.
Пример
Создадим массив в порядке Fortran и сравним флаги:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]], order='F')
print(arr.flags)
Результат выполнения кода:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
Теперь массив расположен в порядке Fortran, что видно по флагу F_CONTIGUOUS.
Пример
Проверим, можно ли записывать данные в массив, и изменим этот флаг:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr.flags['WRITEABLE'])
arr.flags['WRITEABLE'] = False
try:
arr[0] = 10
except ValueError as e:
print(e)
Результат выполнения кода:
True
assignment destination is read-only
После установки флага WRITEABLE в False массив становится доступным только для чтения, и попытка изменения вызывает ошибку.
Пример
Используем метод copy для создания копии массива и посмотрим на флаги:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr_copy = arr.copy()
print(arr.flags['OWNDATA'])
print(arr_copy.flags['OWNDATA'])
Результат выполнения кода:
True
True
Оба массива владеют своими данными, так как copy создаёт независимую копию.
Пример
Проверим, является ли массив представлением (view) другого массива:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr_view = arr[1:4]
print(arr.flags['OWNDATA'])
print(arr_view.flags['OWNDATA'])
Результат выполнения кода:
True
False
Срез массива является представлением, поэтому он не владеет своими данными (флаг OWNDATA равен False).