6

numpy配列を扱うのは初めてで、構造化配列の作成に問題があります。フィールドをさまざまな形状の配列にすることができるMatlab構造に似たものを作成したいと思います。

a=numpy.array([1, 2, 3, 4, 5, 6,]);
b=numpy.array([7,8,9]);
c=numpy.array([10,11,12,13,14,15,16,17,18,19,20]);

##Doesn't do what I want
data=numpy.array([a, b, c],dtype=[('a','f8'),('b','f8'),('c','f8')]);  

data['a']行列a、行列bなどを返したいのですdata['b']が。Matlab構造体で読み取る場合、データはこの形式で保存されるため、可能である必要があります。

4

2 に答える 2

14

NumPyの腕を大きくひねらないと不可能だと思います。

ほら、NumPyの背後にある考え方は、同種の配列、つまり、すべて同じタイプの要素の配列を提供することです。このタイプは単純(intfloat...)またはより複雑([('',int),('',float),('',"|S10")])、ですが、いずれの場合も、すべての要素が同じタイプです。これにより、非常に効率的なメモリレイアウトが可能になります。

したがって、本質的に、構造化配列では、フィールド(個々のサブブロック)が位置に関係なく同じサイズである必要があります。以下を調べてください。

>>> np.zeros(3,dtype=[('a',(int,3)),('b',(float,5))])

3つの要素を持つ配列を定義します。各要素は2つのサブブロックで構成されaていbます。a3つintsbブロック、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

于 2012-09-11T20:59:52.047 に答える
7

Pythonでは、辞書はMatlabの構造にほぼ類似しています。次のことを試して、うまくいくかどうかを確認してください。

>>> data = {'a':a, 'b':b, 'c':c}
>>> data['a'] is a
True
于 2012-09-11T21:04:42.133 に答える