Я считаю data
значение __array_interface__
более информативным:
In [2]: my_array_1.__array_interface__['data']
Out[2]: (33691856, False)
In [3]: my_array_red.__array_interface__['data']
Out[3]: (33691864, False)
In [4]: my_array_blue.__array_interface__['data']
Out[4]: (33691896, False)
In [5]: my_array_yellow.__array_interface__['data']
Out[5]: (33692016, False)
Out[2]
- это начало буфера данных.
red
- этоНа 8 байтов больше - это один элемент с начала.
blue
- это 40 байтов - следующая строка
In [8]: my_array_1.strides
Out[8]: (40, 8)
yellow
- это 160 байтов - это началопоследний ряд (40 от конца)
In [9]: 2016-1856
Out[9]: 160
In [10]: my_array_1.nbytes
Out[10]: 200
Все адреса data
различаются, но находятся в одном поле.Но их труднее интерпретировать.
In [11]: my_array_1.data
Out[11]: <memory at 0x7fa975369a68>
In [12]: my_array_red.data
Out[12]: <memory at 0x7fa975369b40>
In [13]: my_array_blue.data
Out[13]: <memory at 0x7fa975369c18>
In [14]: my_array_yellow.data
Out[14]: <memory at 0x7fa9710f11c8>
Атрибут data
можно использовать в конструкторе ndarray
:
Два элемента из yellow
:
In [17]: np.ndarray(2,dtype=my_array_1.dtype,buffer=my_array_yellow.data)
Out[17]: array([20, 21])
Те же 2 элемента, но с исходным адресом и смещением (как показано выше):
In [18]: np.ndarray(2,dtype=my_array_1.dtype,buffer=my_array_1.data, offset=160)
Out[18]: array([20, 21])
На самом деле дисплей data
ничего не говорит нам огде находится буфер данных.Это адрес объекта memoryview
, который ссылается на буфер, а не адрес самого буфера.Снова вызовите data
и получите другой объект просмотра памяти:
In [19]: my_array_1.data
Out[19]: <memory at 0x7fa975369cf0>
Если я распечатываю эти объекты просмотра памяти, я получаю тот же шаблон, что и вы:
In [22]: print(my_array_1.data)
<memory at 0x7fa970e37120>
In [23]: print(my_array_red.data)
<memory at 0x7fa970e37120>
In [24]: print(my_array_blue.data)
<memory at 0x7fa970e37120>
In [25]: print(my_array_yellow.data)
<memory at 0x7fa9710f17c8>
Для 23 и 24 это просто повторное использование слота памяти, потому что при печати нет постоянства.Я не уверен, почему yellow
не использует его повторно, за исключением того, что, возможно, объект достаточно отличается, чтобы он не помещался в одно и то же пространство.В случаях Out[11]
и т. Д. Буферизация ipython
висит на этих объектах, и, следовательно, нет повторного использования.
Это только подтверждает идею, что в отображении этих memoryview objects
нет ничего существенного.Это не имеет никакого отношения к расположению буфера данных.Это больше похоже на id
, просто произвольное место в памяти.