如何使用ctypes指定Numpy数组的内存地址?

时间:2016-12-19 12:51:59

标签: python-3.x numpy ctypes

我想构建一个从特定内存地址开始的Numpy数组。我该怎么办?我认为解决方案涉及ctypes,但我无法从文档中弄清楚。

更多详情和背景

我想创建一些数组,其值都在顺序内存地址。例如,两个2号阵列,其中第一个阵列的第一个mem地址是N,第二个阵列的最后一个mem地址是N + 3.我可以通过制作一个4号阵列并对其进行切片来实现相同的效果。但是我想为每个"片段分别调用数组构造函数。"我正在尝试跟踪某个C库中的错误。

1 个答案:

答案 0 :(得分:3)

创建一个10字节的数组:

In [287]: x = np.arange(10, dtype=np.uint8)
In [288]: x
Out[288]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)
In [289]: x.__array_interface__
Out[289]: 
{'data': (155596184, False),
 'descr': [('', '|u1')],
 'shape': (10,),
 'strides': None,
 'typestr': '|u1',
 'version': 3}
In [290]: x.data
Out[290]: <memory at 0xaec88f34>

使用相同的数据缓冲区创建另一个数组ndarray,但使用偏移量:

In [291]: y=np.ndarray(shape=(3,), dtype=x.dtype, buffer=x.data, offset=3)
In [292]: y
Out[292]: array([3, 4, 5], dtype=uint8)
In [293]: y.__array_interface__
Out[293]: 
{'data': (155596187, False),
 'descr': [('', '|u1')],
 'shape': (3,),
 'strides': None,
 'typestr': '|u1',
 'version': 3}

这看起来与3元素切片相同:

In [294]: z=x[3:6]
In [295]: z
Out[295]: array([3, 4, 5], dtype=uint8)
In [296]: z.__array_interface__
Out[296]: 
{'data': (155596187, False),
 'descr': [('', '|u1')],
 'shape': (3,),
 'strides': None,
 'typestr': '|u1',
 'version': 3}

如果我对指定内存地址有更多了解,我可能只需使用buffer参数,默认为0 offset。但是根据您的添加内容,使用offset可能正是您想要的。