我想構建一個從特定內存地址開始的Numpy數組。我會怎麼做?我認爲解決方案涉及,但我無法從文檔中找出它。如何使用ctypes指定Numpy數組的內存地址?
更多詳細信息和上下文
我想創建一個數列,其值均在連續的內存地址。例如,兩個大小爲2的數組,其中第一個數組的第一個mem地址是N,第二個數組的最後一個mem地址是N + 3.通過製作一個大小爲4的數組並切片,我可以達到相同的效果。但我想爲每個「切片」分別調用數組構造函數。我試圖跟蹤某個C庫中的一個錯誤。
我想構建一個從特定內存地址開始的Numpy數組。我會怎麼做?我認爲解決方案涉及,但我無法從文檔中找出它。如何使用ctypes指定Numpy數組的內存地址?
更多詳細信息和上下文
我想創建一個數列,其值均在連續的內存地址。例如,兩個大小爲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>
使另一個陣列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}
如果我知道更多關於指定內存地址我可能庫爾d只需要buffer
參數,默認爲0 offset
。但是從你的補充,使用offset
可能正是你想要的。
謝謝你的迴應。這看起來很有希望,明天我會在工作中與它一起玩。理想情況下,我希望能夠指定一個數組來啓動一個特定的指針......例如,第一個數組尾端後的第一個內存地址......我想我可以使用它。我真的試圖避免進入我正在處理的C庫的雜草,但它可能是不可避免的。這裏是我試圖在PyFFTW中追蹤的問題的鏈接。我用一個重現錯誤的腳本發佈了這個例子。也許你可能想看看它。 :) https://github.com/pyFFTW/pyFFTW/issues/139 –
PyFFTW是一個圍繞FFTW快速傅立葉變換庫的Python包裝。 –
我不喜歡問*「你到底做了什麼?」*,但仍然有人傾向於這樣做。 – nmnsud
'np.ndarray'可以創建一個具有現有數據緩衝區的數組。 – hpaulj
有關更多詳細信息,該內存地址是什麼? – hpaulj