Массив и его атрибуты:
In [28]: arr = np.arange(1,8)
In [29]: arr.__array_interface__
Out[29]:
{'data': (41034176, False),
'strides': None,
'descr': [('', '<i8')],
'typestr': '<i8',
'shape': (7,),
'version': 3}
Расположение буфера данных для среза:
In [30]: arr[4:].__array_interface__['data'][0]
Out[30]: 41034208
In [31]: arr[4:].__array_interface__['data'][0]-arr.__array_interface__['data'][0]
Out[31]: 32
Срез разделяет буфер данных, но со смещением 4 элемента (4 * 8).
Используя эту информацию, я могу получить фрагмент, используя конструктор ndarray
(обычно не требуется):
In [35]: np.ndarray((3,), dtype=int, buffer=arr.data, offset=32)
Out[35]: array([5, 6, 7])
In [36]: arr[4:7]
Out[36]: array([5, 6, 7])
arr.data
- это объект memoryview
, который как-то ссылается на буфер данных этого массива. Идентификатор / адрес arr.data
не совпадает с указателем данных, который я использовал выше.
In [38]: arr.data
Out[38]: <memory at 0x7f996d950e88>
In [39]: type(arr.data)
Out[39]: memoryview
Обратите внимание, что расположение данных для arr[4]
совершенно другое. Это «без коробки», а не ломтик:
In [37]: arr[4].__array_interface__
Out[37]:
{'data': (38269024, False),
'strides': None,
'descr': [('', '<i8')],
'typestr': '<i8',
'shape': (),
'version': 3,
'__ref': array(5)}