2016-12-19 101 views
1

我想構建一個從特定內存地址開始的Numpy數組。我會怎麼做?我認爲解決方案涉及​​,但我無法從文檔中找出它。如何使用ctypes指定Numpy數組的內存地址?

更多詳細信息和上下文

我想創建一個數列,其值均在連續的內存地址。例如,兩個大小爲2的數組,其中第一個數組的第一個mem地址是N,第二個數組的最後一個mem地址是N + 3.通過製作一個大小爲4的數組並切片,我可以達到相同的效果。但我想爲每個「切片」分別調用數組構造函數。我試圖跟蹤某個C庫中的一個錯誤。

+0

我不喜歡問*「你到底做了什麼?」*,但仍然有人傾向於這樣做。 – nmnsud

+0

'np.ndarray'可以創建一個具有現有數據緩衝區的數組。 – hpaulj

+1

有關更多詳細信息,該內存地址是什麼? – hpaulj

回答

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} 

如果我知道更多關於指定內存地址我可能庫爾d只需要buffer參數,默認爲0 offset。但是從你的補充,使用offset可能正是你想要的。

+0

謝謝你的迴應。這看起來很有希望,明天我會在工作中與它一起玩。理想情況下,我希望能夠指定一個數組來啓動一個特定的指針......例如,第一個數組尾端後的第一個內存地址......我想我可以使用它。我真的試圖避免進入我正在處理的C庫的雜草,但它可能是不可避免的。這裏是我試圖在PyFFTW中追蹤的問題的鏈接。我用一個重現錯誤的腳本發佈了這個例子。也許你可能想看看它。 :) https://github.com/pyFFTW/pyFFTW/issues/139 –

+0

PyFFTW是一個圍繞FFTW快速傅立葉變換庫的Python包裝。 –