我试图理解numpy中ndarray.data
字段的含义(参见N维数组参考页面的memory layout部分),特别是对于数组的视图。引用文档:
ndarray.data - 指向数组数据开头的Python缓冲区对象
根据这个描述,我希望这是一个指向ndarray实例底层的C数组的指针。
考虑x = np.arange(5, dtype=np.float64)
。
使用切片y
将x
表格视为y = x[3:1:-1]
的视图。
我希望x.data
指向0.
和y.data
的位置,指向3.
的位置。我期待由y.data
打印的内存指针因3*x.itemsize
打印的内存指针的x.data
字节而偏移,但情况似乎并非如此:
>>> import numpy as np
>>> x = np.arange(5, dtype=np.float64)
>>> y = x[ 3:1:-1]
>>> x.data
<memory at 0x000000F2F5150348>
>>> y.data
<memory at 0x000000F2F5150408>
>>> int('0x000000F2F5150408', 16) - int('0x000000F2F5150348', 16)
192
>>> 3*x.itemsize
24
与ndarray实例关联的'data'
字典中的__array_interface
键的行为更像我期望的,尽管它本身可能不是指针:
>>> y.__array_interface__['data'][0] - x.__array_interface__['data'][0]
24
所以这引出了一个问题,
ndarray.data
给出了什么?
提前致谢。
答案 0 :(得分:3)
memoryview
是位于地址0x000000F2F5150348
的{{1}}个对象;它提供访问的缓冲区位于其他地方。
Memoryviews提供了{{3}}中描述的许多操作,但至少在Python端API上,它们没有提供任何方法来访问它们公开的内存的原始地址。特别是,at whatevernumber
号码不是您想要的。
答案 1 :(得分:2)
通常x.data
显示的数字并不意味着您使用。 x.data
是缓冲区,可以在期望缓冲区的其他上下文中使用。
np.frombuffer(x.data,dtype=float)
复制您的x
。
np.frombuffer(x[3:].data,dtype=float)
这会复制x[3:]
。但是从Python中你不能使用x.data
,向它添加192位(3 * 8 * 8),并期望获得x[3:]
。
我经常使用__array_interface__['data']
值来检查两个变量是否共享一个数据缓冲区,但我不会将这个数字用于任何事情。这些是信息性的数字,而不是工作价值。
我最近在
中探讨了这个问题