NumPyの腕を大きくひねらないと不可能だと思います。
ほら、NumPyの背後にある考え方は、同種の配列、つまり、すべて同じタイプの要素の配列を提供することです。このタイプは単純(int
、float
...)またはより複雑([('',int),('',float),('',"|S10")])
、ですが、いずれの場合も、すべての要素が同じタイプです。これにより、非常に効率的なメモリレイアウトが可能になります。
したがって、本質的に、構造化配列では、フィールド(個々のサブブロック)が位置に関係なく同じサイズである必要があります。以下を調べてください。
>>> np.zeros(3,dtype=[('a',(int,3)),('b',(float,5))])
3つの要素を持つ配列を定義します。各要素は2つのサブブロックで構成されa
ていb
ます。a
3つints
のb
ブロック、5つのブロックですfloats
。しかし、でブロックの初期サイズを定義すると、dtype
それで行き詰まります(まあ、いつでも切り替えることができますが、それは別の話です)。
回避策があります:を使用しdtype=object
ます。このようにして、さまざまなサイズのリストの配列など、異種アイテムの配列を作成します。しかし、その方法で多くのNumPyパワーを失います。それでも、例:
>>> x=np.zeros(3, dtype=[('a',object), ('b',object)])
>>> x['a'][0] = [1,2,3,4]
>>> x['b'][-1] = "ABCDEF"
>>> print x
[([1, 2, 3, 4], 0) (0, 0) (0, 'ABCD')]
つまり、...オブジェクトの配列を作成しただけです。私はどこかにリストを置き、どこかに文字列を置き、それは機能します。同じ例に従って、必要な配列を作成できます。
blob = np.array([(a,b,c)],dtype=[('a',object),('b',object),('c',object)])
しかし、それが本当にあなたの目的のための意味であるかどうかを本当によく考えるべきです。別の構造がおそらくより効率的でしょう。
[(a,b,c)]
補足:上記の式の部分に注意してください:()
?に注意してください 基本的に、NumPyに、3つのサブ要素(各に1つa,b,c
)で構成される1つの要素の配列を作成するように指示します。各サブ要素は、オブジェクトです。を入れないと()
、NumPyはたくさん泣き言を言います。
そして最後のコメント:のようなフィールドにアクセスするとblob['a']
、サイズの配列が取得さ(1,)
れ、 :元の配列を取得するためにdtype=object
使用します。blob['a'].item()
(6,)
int