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

Python 3.x 如何使用ctypes指定Numpy数组的内存地址?,python-3.x,numpy,ctypes,Python 3.x,Numpy,Ctypes,我想构造一个从特定内存地址开始的Numpy数组。我该怎么做?我假设解决方案涉及ctypes,但我无法从文档中找到它 更多详细信息和上下文 我想创建一些数组,它们的值都位于顺序内存地址。例如,两个大小为2的阵列,其中第一个阵列的第一个mem地址为N,第二个阵列的最后一个mem地址为N+3。我可以通过制作一个大小为4的阵列并将其切片来达到同样的效果。。。但是我想为每个“切片”单独调用数组构造函数。我试图跟踪某个C库中的错误。制作一个10字节的数组: In [287]: x = np.arange(1

我想构造一个从特定内存地址开始的Numpy数组。我该怎么做?我假设解决方案涉及
ctypes
,但我无法从文档中找到它

更多详细信息和上下文


我想创建一些数组,它们的值都位于顺序内存地址。例如,两个大小为2的阵列,其中第一个阵列的第一个mem地址为N,第二个阵列的最后一个mem地址为N+3。我可以通过制作一个大小为4的阵列并将其切片来达到同样的效果。。。但是我想为每个“切片”单独调用数组构造函数。我试图跟踪某个C库中的错误。

制作一个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>
这看起来与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
就可以了。但是从您添加的内容来看,偏移量的使用可能正是您想要的。

创建一个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>
这看起来与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
的使用可能正是您想要的。

我不喜欢问“到目前为止您尝试了什么?”但人们还是倾向于这样做。
np.ndarray
可以使用现有的数据缓冲区创建数组。有关更多详细信息,该内存地址是什么?我将更新该问题。。。“但是我想为每个“切片”单独调用数组构造函数。”-这正是切片所要做的,而不是切片版本将具有
。base不是None
,我不喜欢问“到目前为止您尝试了什么?”?“,但人们还是倾向于我这样做。
np.ndarray
可以使用现有的数据缓冲区生成数组。有关更多详细信息,该内存地址是什么?我将更新问题…”但我想为每个“切片”单独调用数组构造函数。“-这正是切片所要做的,除切片版本外,其他版本将具有
。base不是None
感谢您的响应。这看起来很有希望,明天我会在工作中玩它。理想情况下,我希望能够指定一个数组来启动特定的指针。。。例如,第一个数组末尾之后的第一个内存地址..我想我可以处理这个。我真的在努力避免进入我正在处理的C库,但这可能是不可避免的。这是我试图在PyFFTW中追踪的问题的链接。我用一个脚本发布了这个示例,该脚本再现了错误。也许你想看看它。:)PyFFTW是FFTW快速傅立叶变换库的Python包装器。感谢您的回复。这看起来很有希望,明天我会在工作中玩它。理想情况下,我希望能够指定一个数组来启动特定的指针。。。例如,第一个数组末尾之后的第一个内存地址..我想我可以处理这个。我真的在努力避免进入我正在处理的C库,但这可能是不可避免的。这是我试图在PyFFTW中追踪的问题的链接。我用一个脚本发布了这个示例,该脚本再现了错误。也许你想看看它。:)PyFFTW是FFTW快速傅立叶变换库的Python包装器。