如何使用 ctypes 指定 Numpy 数组的内存地址?
how can I specify the memory address of a Numpy array using ctypes?
我想构建一个从特定内存地址开始的 Numpy 数组。我该怎么做?我认为解决方案涉及 ctypes
,但我无法从文档中找出答案。
更多详细信息和上下文
我想创建一些数组,它们的值都在连续的内存地址中。例如,两个大小为 2 的数组,其中第一个数组的第一个内存地址为 N,第二个数组的最后一个内存地址为 N + 3。我可以通过制作一个大小为 4 的数组并将其切片来实现相同的效果。 . 但我想为每个单独的时间调用数组构造函数 "slice." 我正在尝试跟踪某个 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>
用 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
可能正是您想要的。
我想构建一个从特定内存地址开始的 Numpy 数组。我该怎么做?我认为解决方案涉及 ctypes
,但我无法从文档中找出答案。
更多详细信息和上下文
我想创建一些数组,它们的值都在连续的内存地址中。例如,两个大小为 2 的数组,其中第一个数组的第一个内存地址为 N,第二个数组的最后一个内存地址为 N + 3。我可以通过制作一个大小为 4 的数组并将其切片来实现相同的效果。 . 但我想为每个单独的时间调用数组构造函数 "slice." 我正在尝试跟踪某个 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>
用 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
可能正是您想要的。