【问题标题】:how to get the memory address of a numpy array for C如何获取C的numpy数组的内存地址
【发布时间】:2012-06-29 15:41:48
【问题描述】:

我构造了一个 numpy 数组::

a=np.ndarray([2,3]) 

然后我想看看它的数据在哪里::

a.data 
>>>Out[213]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E87A0> 
a.data 
>>>Out[214]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E82A0> 
a.data 
>>>Out[215]: <read-write buffer for 0x0482C1D0, size 48, offset 0 at 0x049E81C0> 

...

为什么每次偏移地址都不一样? 如果我想使用 c_types 将数据传输到 c 函数::

ctypes_array = (ctypes.c_char * a.size * 8).from_address(ptr) 

我应该如何获得ptr的值?

【问题讨论】:

标签: python numpy


【解决方案1】:

另外,请查看ndarray.__array_interface__,这是一个包含您所追求的所有信息的字典。

在你的情况下,

pointer, read_only_flag = a.__array_interface__['data']

【讨论】:

  • 很高兴它有帮助!不过,这可能不是最好或最有效的方法。正如 J.F.Sebastian 提到的,看看numpy.ctypeslib(如果我没记错的话,它也使用了__array_interface__。)。
  • @Joe a.__array_interface__['data']的结果不等于a.data的echo中的地址,如下&gt;&gt;&gt;a=array([(1,2)]) &gt;&gt;&gt; a.data &lt;read-write buffer for 0x8b174c0, size 8, offset 0 at 0x8af6120&gt; &gt;&gt;&gt; print hex(a.__array_interface__['data'][0]) 0x893ff38
  • @Samuel - 这是因为a.data 是一个buffer 对象,而不是实际的内存缓冲区本身。请注意,每次调用 a.data 时都会创建一个新的不同缓冲区对象(正如 J.F. Sebastian 在他的回答中指出的那样)。看看:docs.python.org/2/library/functions.html#buffer
【解决方案2】:

a.data 可能是一个属性,它的 getter 函数在每次调用时都会创建一个新的缓冲区对象(元数据)。

要获取地址,请查看numpy.ctypeslib.as_ctypes() 是如何实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多