7

やや不均一なデータ型のnumpy配列を使用することに興味があります。numpyはデータが同種でなければならないと指定しているので、これはすべてのサブdtypeのユニオンラッパーとして機能するsuper-dtypeを定義することで実現されます。次に、サブdtypeのフィールドにアクセスすると、基になるデータの異なる解釈が得られます。

たとえば、これにはすでにいくつかの機能があります

dtype(('|S2', [('x', '|i1'), ('y', '|i1')]))

は2バイトの文字列の配列を指しますが、1番目と2番目のバイトは、「x」および「y」フィールド名を介して整数として解釈することもできます。ただし、2バイトの文字列にフィールドラベルを割り当てる方法がわかりません。

これをより一般的にして、データに任意の数の異なるフィールド仕様をオーバーレイできるようにすることはできますか?

私の最初の試みは、dtypeでフィールドオフセットを指定することでしたが、オフセットを並べ替える必要があるという苦情で失敗しました(つまり、重複しないデータ)。

dtype1 = np.dtype(dict(
   names=['a','b'], 
   formats=['|a2','<i2'], 
   offsets=[0,0]))

別の手法も機能しますが、面倒です。この手法では、いくつかの変数を同じ基になるデータのビューとして定義し、さまざまな変数のdtypeを変更して、さまざまな形式のデータにアクセスできるようにすることができます。

a=np.zeros(3, dtype='<a2')
b=a[:]
b.dtype='<i2'

これにより、aとbのどちらを見ているかに応じて、文字列または整数としてデータにアクセスできます。しかし、それはデータを操作する面倒な方法です。理想的には、任意のオフセットでさまざまな異なるフィールドを指定できるようにしたいと思います。これを行う方法はありますか?

4

1 に答える 1

5

ユニオン dtype は 2011 年 6 月から許可されています: https://github.com/numpy/numpy/pull/94

これを使用するには、NumPy 1.7.x にアップグレードする必要があります。

ただし、以前のバージョンでは、overlay dtype コンストラクターを使用できます。

>>> a = np.zeros(3, dtype=np.dtype(('<i2', [('a', '|a2')])))
>>> a[0] = 0x3456
>>> a['a'][0]
'V4'

これはhttp://docs.scipy.org/doc/numpy-dev/reference/arrays.dtypes.html#specifying-and-constructing-data-typesで文書化されています( を検索して(base_dtype, new_dtype)ください)。

于 2013-01-14T14:47:09.793 に答える