ndarray.data对numpy

时间:2016-09-14 22:05:12

标签: python python-3.x numpy

我试图理解numpy中ndarray.data字段的含义(参见N维数组参考页面的memory layout部分),特别是对于数组的视图。引用文档:

  

ndarray.data - 指向数组数据开头的Python缓冲区对象

根据这个描述,我希望这是一个指向ndarray实例底层的C数组的指针。

考虑x = np.arange(5, dtype=np.float64)

使用切片yx表格视为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给出了什么?

提前致谢。

2 个答案:

答案 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']值来检查两个变量是否共享一个数据缓冲区,但我不会将这个数字用于任何事情。这些是信息性的数字,而不是工作价值。

我最近在

中探讨了这个问题

Creating a NumPy array directly from __array_interface__