2016-12-19 5 views
1

特定のメモリアドレスから始まるNumpy配列を作成したいと思います。どうすればいい?私は解決策には​​が含まれていると仮定していますが、私はそれをドキュメントから把握することはできません。ctypesを使用してNumpy配列のメモリアドレスを指定する方法はありますか?

詳細およびコンテキスト

私は値がすべてのシーケンシャルメモリアドレスにあるアレイの数を作成したいと思います。例えば、2つのサイズの2つの配列、1番目の配列の1番目のmemアドレスはN、2番目の配列の最後の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ラッパーです。 –

関連する問題