我找到了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
The 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>
The 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
display 没有告诉我们任何有关数据缓冲区所在位置的信息。这是地址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
,只是内存中的任意位置。