1
最初の要素がintであり、残りが浮動小数点である効率的な異種配列が必要です。しかし、それを作成した後は、基本的な配列操作が爆発的になります。異種のnumpy配列に対する配列操作
A = np.zeros(1, dtype='i4, f4, f4')
B = np.array([3,3,3])
A + B
TypeError: invalid type promotion
最初の要素がintであり、残りが浮動小数点である効率的な異種配列が必要です。しかし、それを作成した後は、基本的な配列操作が爆発的になります。異種のnumpy配列に対する配列操作
A = np.zeros(1, dtype='i4, f4, f4')
B = np.array([3,3,3])
A + B
TypeError: invalid type promotion
このような構造化配列では、フィールドの繰り返しを呼び出す操作は一般に機能しません。
はしても、それ自体に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
元素を添加する方法はありますint
にint
を追加する方法は、だint
にfloat
ではなく、別の要素に
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として表示し、正規の数式を実行することができます。しかし、浮動小数点数と整数の組み合わせでは、それは不可能です。
なぜ、Bのdtypeも指定しないのですか? – ely
dtype構文は、1〜3要素の配列ではなく1〜3組のタプルを作成しています。 np.zerosのカスタムdtypesを見てください。 – bejota
@bejotaそれは私が意味するものではありません。私は、使用するデフォルトのint型を選択させたり、指定したり、レコード型を指定したりするのではなく、あなたがBのdtype ''i4、f4、f4''を与えようとすると、OPの元々の要求が理にかなっていない理由を説明するエラーが出ます(そのような配列を解釈するバイトが必要です)。したがって、レコードタイプを使用し、フィールドを繰り返し処理します。 – ely