2016-05-03 10 views
1

最初の要素がintであり、残りが浮動小数点である効率的な異種配列が必要です。しかし、それを作成した後は、基本的な配列操作が爆発的になります。異種のnumpy配列に対する配列操作

A = np.zeros(1, dtype='i4, f4, f4') 
B = np.array([3,3,3]) 
A + B 
TypeError: invalid type promotion 
+0

なぜ、Bのdtypeも指定しないのですか? – ely

+0

dtype構文は、1〜3要素の配列ではなく1〜3組のタプルを作成しています。 np.zerosのカスタムdtypesを見てください。 – bejota

+0

@bejotaそれは私が意味するものではありません。私は、使用するデフォルトのint型を選択させたり、指定したり、レコード型を指定したりするのではなく、あなたがBのdtype ''i4、f4、f4''を与えようとすると、OPの元々の要求が理にかなっていない理由を説明するエラーが出ます(そのような配列を解釈するバイトが必要です)。したがって、レコードタイプを使用し、フィールドを繰り返し処理します。 – ely

答えて

3

このような構造化配列では、フィールドの繰り返しを呼び出す操作は一般に機能しません。

はしても、それ自体にAを追加することはできません。つまり

In [476]: A = np.zeros(1, dtype='i4, f4, f4') 

In [477]: A+A 
... 
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype([('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4')]) .... 

を、A元素を添加する方法はありますintintを追加する方法は、だintfloatではなく、別の要素に

Aの要素を使用すると、通常のフィールド名を反復しなければならない構造化された配列のフィールド間で動作するには(あなたがそれにアクセスする方法に応じて)tupleまたはnumpy.void

In [478]: A.item() 
Out[478]: (0, 0.0, 0.0) 

In [479]: type(A.item()) 
Out[479]: tuple 

In [480]: type(A[0]) 
Out[480]: numpy.void 

です。

In [493]: B=np.arange(3) 

In [494]: for i,name in enumerate(A.dtype.names): 
    A[name] = A[name]+B[i] 
    .....: 

In [495]: A 
Out[495]: 
array([(0, 1.0, 2.0)], 
     dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4')]) 

すべてのフィールドが同じタイプである場合。 dtype='i4, i4, i4'の場合、構造化された配列を同種のdtypeとして表示し、正規の数式を実行することができます。しかし、浮動小数点数と整数の組み合わせでは、それは不可能です。