Я не смотрю на flags
почти так же, как __array_interface__
(особенно его ключ data
).
Является ли метод / функция 'native' (скомпилированным?), Не имеет ничего общего с OWNDATA.
In [16]: np.arange(12).flags['OWNDATA']
Out[16]: True
In [17]: np.arange(12).reshape(3,4).flags['OWNDATA']
Out[17]: False
In [18]: np.arange(12).reshape(3,4).copy().flags['OWNDATA']
Out[18]: True
reshape
- это быстрый скомпилированный код, но он возвращает view
новый массив с собственными shape
и strides
, но ссылающийся на буфер данных arange
. Этот массив 1d arange
все еще существует, хотя я никогда не назначал его переменной.
copy
создает новый массив со своими собственными данными. Эта копия дороже, чем изменение формы, и обычно не требуется - если только мне не нужно обеспечить полную независимость между массивами.
Мы можем проиллюстрировать последствия (ы) OWNDATA с помощью:
In [19]: x = np.arange(12)
In [20]: y = x.reshape(3,4)
In [21]: z = y.copy()
In [22]: z[0,:] *= 10
In [23]: z
Out[23]:
array([[ 0, 10, 20, 30],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [24]: x # no change
Out[24]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In [25]: y[0,:] *= 10
In [26]: y
Out[26]:
array([[ 0, 10, 20, 30],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [27]: x # changing y changed x
Out[27]: array([ 0, 10, 20, 30, 4, 5, 6, 7, 8, 9, 10, 11])