The flags object can be accessed dictionary-like (as in a.flags['WRITEABLE']),
or by using lowercased attribute names (as in a.flags.writeable). Short flag
names are only supported in dictionary access.

Only the UPDATEIFCOPY, WRITEABLE, and ALIGNED flags can be changed by
the user, via direct assignment to the attribute or dictionary entry,
or by calling ndarray.setflags.

The array flags cannot be set arbitrarily:

UPDATEIFCOPY can only be set False.

ALIGNED can only be set True if the data is truly aligned.

WRITEABLE can only be set True if the array owns its own memory
or the ultimate owner of the memory exposes a writeable buffer
interface or is a string.

Arrays can be both C-style and Fortran-style contiguous simultaneously.
This is clear for 1-dimensional arrays, but can also be true for higher
dimensional arrays.

Even for contiguous arrays a stride for a given dimension
arr.strides[dim] may be arbitrary if arr.shape[dim]==1
or the array has no elements.
It does not generally hold that self.strides[-1]==self.itemsize
for C-style contiguous arrays or self.strides[0]==self.itemsize for
Fortran-style contiguous arrays is true.