2011-11-19 10 views
3

大きな行列(配列)構造(3軸)を作成する必要があり、各要素はPythonオブジェクト(myclassインスタンス)への参照を格納する必要があります。そのような配列を作成するためにnumpyを使用することは可能ですか? Pythonリファレンスを格納するために使用するデータ型はどれですか? numpyの利点は、さまざまなレベルでのスライスのサポートです。代わりにネストされた(ネストされた)リストを作成することですが、それは厄介な解決策です。NumPyとオブジェクト参照を持つPython 3

答えて

2

dtype=objectを使用して、Pythonオブジェクトを配列に格納します。

import numpy as np 

class Foo: pass 

arr=np.empty(2,dtype=object) 
arr[:]=[Foo(),Foo()] 
print(arr) 
# [<__main__.Foo instance at 0xb7827d0c> 
# <__main__.Foo instance at 0xb748b5ac>] 

print(arr.dtype) 
# object 
+3

あなたが興味があるのであれば、numPyがオブジェクトへのポインタをdtype 'object'の配列に格納するだけであることを調べることができます:' x = object(); a = np.array([x、x]); struct.unpack( '2L'、ctypes.string_at(a.ctypes.data、8)) '(32ビットPython)。 – eryksun

+0

@eryksun: 'ctypes.string_at(a.ctypes.data、8)'を単純でより一般的な 'a.tostring()'に置き換えることができます。 – EOL

+0

@eryksun:あなたのコメントを+1しました: 'ctypes.string_at()'は本当に興味深い関数です。 :) – EOL

1

ちょうどDTYPEとしてobjectを与え、そしてあなたが欲しいものを保存することができます。

import numpy 

print numpy.array([['a', (2, 2)], [1, 2+3j], [open, xrange(7)]], dtype=object) 

あなたがmyclass代わりのobjectを使用する場合がありますので、認識されないタイプは、このように動作します。 objectは、numpyの最適化なしで任意のオブジェクトを格納することを明確にしています。詳細については、the docsを参照してください。

1

あなたは特別な何もする必要はありません。これは、箱から出して動作します:

>>> import numpy 
>>> class TheClass(object): 
...  pass 
... 
>>> numpy.array([TheClass(), TheClass()]) 

array([<__main__.TheClass object at 0x10d435a50>, 
     <__main__.TheClass object at 0x10d435a90>], dtype=object) 

numpyのが自動的に検出配列オブジェクトは、などの標準スカラ型(float型、int型、の一つではないこと。)これを自動的にdtypeobjectに設定して処理します。

関連する問題