基本的な構造化配列は、1 つの名前でインデックス付けできるものを提供します。
In [276]: dt=np.dtype([('A',int),('B',int),('C',int)])
In [277]: x=np.arange(9).reshape(3,3).view(dtype=dt)
In [278]: x
Out[278]:
array([[(0, 1, 2)],
[(3, 4, 5)],
[(6, 7, 8)]],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
In [279]: x['B'] # index by field name
Out[279]:
array([[1],
[4],
[7]])
In [280]: x[1] # index by row (array element)
Out[280]:
array([(3, 4, 5)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
In [281]: x['B'][1]
Out[281]: array([4])
In [282]: x.shape # could be reshaped to (3,)
Out[282]: (3, 1)
ビュー アプローチでは 2 次元配列が生成されましたが、列は 1 つしかありませんでした。通常の列は dtype フィールドに置き換えられます。それは 2 d ですが、ひねりを加えています。view
データ バッファーを使用しても変更されません。dtype は、これらの「列」にアクセスする別の方法を提供するだけです。 dtype
フィールドは、技術的にはディメンションではありません。それらは配列の.shape
またはに登録されません。.ndim
また、ご利用いただけませんx[0,'A']
。
recarray
は同じことを行いますが、フィールドに属性としてアクセスするオプションを追加します。たとえばx.B
、 は と同じx['B']
です。
rows
インデックス番号でアクセスする必要があります。
構造化配列を作成するもう 1 つの方法は、値をタプルのリストとして定義することです。
In [283]: x1 = np.arange(9).reshape(3,3)
In [284]: x2=np.array([tuple(i) for i in x1],dtype=dt)
In [285]: x2
Out[285]:
array([(0, 1, 2), (3, 4, 5), (6, 7, 8)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
In [286]: x2.shape
Out[286]: (3,)
ones
、zeros
、empty
基本的な構造化配列も構築します
In [287]: np.ones((3,),dtype=dt)
Out[287]:
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
dtype をネストすることで、2 つのフィールド名でインデックス付けされた配列を作成できます。
In [294]: dt1=np.dtype([('D',int),('E',int),('F',int)])
In [295]: dt2=np.dtype([('A',dt1),('B',dt1),('C',dt1)])
In [296]: y=np.ones((),dtype=dt2)
In [297]: y
Out[297]:
array(((1, 1, 1), (1, 1, 1), (1, 1, 1)),
dtype=[('A', [('D', '<i4'), ('E', '<i4'), ('F', '<i4')]), ('B', [('D', '<i4'), ('E', '<i4'), ('F', '<i4')]), ('C', [('D', '<i4'), ('E', '<i4'), ('F', '<i4')])])
In [298]: y['A']['F']
Out[298]: array(1)
しかし、率直に言って、これはかなり複雑です。arange(9)
要素を(フィールド名を反復せずに)設定する方法さえ理解していません。
構造化配列は、 (または)csv
を使用してファイルを読み取ることによって最も一般的に生成されます。結果は、ラベルが付けられた各列の名前付きフィールドと、ファイル内の各行の番号付きの「行」です。np.genfromtxt
loadtxt