3

structured array列と行の名前でアクセスできるPythonでを構築しようとしています。structured arrayこれはnumpyの方法で可能ですか?

例: 私の配列は、おおよそ次の形式である必要があります。

My_array =        A B C 
                E 1 2 3 
                F 4 5 6 
                G 7 8 9 

そして、私は次のことを行う可能性が欲しいです:

My_array["A"]["E"] = 1
My_array["C"]["F"] = 6

pythonを使用してこれを行うことは可能ですstructured arraysか、またはそのようなタスクにより適した別のタイプの構造がありますか?

4

2 に答える 2

2

基本的な構造化配列は、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,)

oneszerosempty基本的な構造化配列も構築します

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.genfromtxtloadtxt

于 2015-07-10T16:40:05.407 に答える
1

再配列を使用すると、ドット表記または列名への特定の参照を使用して列にアクセスできます。行の場合、行番号でアクセスします。たとえば、行名を介してアクセスされるのを見たことがありません。

>>> import numpy as np
>>> a = np.arange(1,10,1).reshape(3,3)
>>> dt = np.dtype([('A','int'),('B','int'),('C','int')])
>>> a.dtype = dt
>>> r = a.view(type=np.recarray)
>>> r
rec.array([[(1, 2, 3)],
       [(4, 5, 6)],
       [(7, 8, 9)]], 
      dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
>>> r.A
array([[1],
       [4],
       [7]])
>>> r['A']
array([[1],
       [4],
       [7]])
>>> r.A[0]
array([1])
>>> a['A'][0]
array([1])
>>> # now for the row
>>> >>> r[0]
rec.array([(1, 2, 3)], 
      dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
>>>

dtype と type を同時に指定できます

>>> a = np.ones((3,3))
>>> b = a.view(dtype= [('A','<f8'), ('B','<f8'),('C', '<f8')], type = np.recarray)
>>> b
rec.array([[(1.0, 1.0, 1.0)],
       [(1.0, 1.0, 1.0)],
       [(1.0, 1.0, 1.0)]], 
      dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
>>> b.A
array([[ 1.],
       [ 1.],
       [ 1.]])
>>> b.A[0]
array([ 1.])
于 2015-07-10T10:03:38.607 に答える