2017-01-17 23 views
4

numpy.lib.recfunctions.append_fieldsを使用して、既存の再配列に2Dフィールドを追加したいとします。 再配列を作ったとしましょう。numpy再配列に2d配列(フィールド)を追加

> arr = np.recarray(10, [("afield", "<f8"), ('pos', '<f8', (3,))]) 
> arr.dtype 
dtype((numpy.record, [('afield', '<f8'), ('pos', '<f8', (3,))])) 

と私はARRのように見えるようにフィールドを追加したい:

> arr.dtype 
dtype((numpy.record, [('afield', '<f8'), ('pos', '<f8', (3,)), ('vel', '<f8', (3,))])) 

私は=パラメータdtypesに合格するかわからないです。 dtypes = np.dtype( "f8"、(3、))を成功させました。

> from numpy.lib.recfunctions import append_fields 
> data = arr["pos"][:] 
> new_arr = append_fields(arr, 'vel', data, dtypes =np.dtype("f8",(3,)),usemask=False) 
ValueError: could not broadcast input array from shape (10,3) into shape (10) 

また、1要素のリストを渡すと別のエラーが発生します。

> new_arr = append_fields(arr, 'vel', data, dtypes =[("f8",(3,))],usemask=False) 
ValueError: could not broadcast input array from shape (10,3) into shape (10,3,3) 

私は(10,3)の形状をしたいが、私は唯一の(10,)または(10,3,3)を得ることができます。ここで

+0

ここでは敗者だと思うし、 'append_fields'は目的に合っていません。 numpyに対するパッチはおそらく順序通りです – Eric

+0

@Ericがそれを指摘してくれてありがとう。いつかすぐに、より多くの機能が実装されることを願っています。それまでは、私は自分のやり方で料理をするつもりです –

答えて

1

append_fieldsで終わる、および他のほとんどのrecarray新しいdtypeemptyの配列を作成し、フィールドをその結果にオリジナル。

私は構造化された配列を示します

オリジナルdtypeは、配列:

In [102]: dt=np.dtype([('afield','f'),('pos','f',(3,))]) 
In [103]: dt 
Out[103]: dtype([('afield', '<f4'), ('pos', '<f4', (3,))]) 
In [104]: arr = np.ones((3,),dtype=dt) 
In [105]: arr 
Out[105]: 
array([(1.0, [1.0, 1.0, 1.0]), (1.0, [1.0, 1.0, 1.0]), 
     (1.0, [1.0, 1.0, 1.0])], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,))]) 

修正DTYPE:

In [106]: dt1=np.dtype([('afield','f'),('pos','f',(3,)),('vel','f',(2,))]) 
In [107]: arr1 = np.empty((3,),dtype=dt1) 
In [108]: arr1 
Out[108]: 
array([(0.0, [0.0, 0.0, 0.0], [0.0, 0.0]), 
     (0.0, [0.0, 0.0, 0.0], [0.0, 0.0]), 
     (0.0, [0.0, 0.0, 0.0], [0.0, 0.0])], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', '<f4', (2,))]) 
In [109]: for name in dt.names: 
    .....:  arr1[name] = arr[name] 

In [110]: arr1 
Out[110]: 
array([(1.0, [1.0, 1.0, 1.0], [0.0, 0.0]), 
     (1.0, [1.0, 1.0, 1.0], [0.0, 0.0]), 
     (1.0, [1.0, 1.0, 1.0], [0.0, 0.0])], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', '<f4', (2,))]) 

recarrayが同じものであるが、フィールドにアクセスする能力を持ちます属性として(arr.pos)。私はrecursive_fillステップでエラーを得ていた(2)フィールドに

In [118]: rf.append_fields(arr, 'vel', np.arange(3),usemask=False) 
Out[118]: 
array([(1.0, [1.0, 1.0, 1.0], 0), (1.0, [1.0, 1.0, 1.0], 1), 
     (1.0, [1.0, 1.0, 1.0], 2)], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', '<i4')]) 

単純な整数フィールドを追加します。

In [206]: arr = np.ones((3,),dtype=dt) 
In [207]: arr1 = np.zeros((3,),dtype=dt1) 
In [208]: rf.recursive_fill_fields(arr,arr1) 
Out[208]: 
array([(1.0, [1.0, 1.0, 1.0], [0.0, 0.0]), 
     (1.0, [1.0, 1.0, 1.0], [0.0, 0.0]), 
     (1.0, [1.0, 1.0, 1.0], [0.0, 0.0])], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', '<f4', (2,))]) 

In [210]: x = np.ones((3,),dtype=[('vel','f',(2,))]) 
In [211]: x['vel'] *= 2 
In [212]: rf.recursive_fill_fields(x,arr1) 
Out[212]: 
array([(1.0, [1.0, 1.0, 1.0], [2.0, 2.0]), 
     (1.0, [1.0, 1.0, 1.0], [2.0, 2.0]), 
     (1.0, [1.0, 1.0, 1.0], [2.0, 2.0])], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', '<f4', (2,))]) 

append_fieldsでそのxしてみてください:私は私のdt1配列埋めるためにそれを使用することができ、適切な入力で

In [213]: rf.append_fields(arr, 'vel', x, usemask=False) 
Out[213]: 
array([(1.0, [1.0, 1.0, 1.0], ([2.0, 2.0],)), 
     (1.0, [1.0, 1.0, 1.0], ([2.0, 2.0],)), 
     (1.0, [1.0, 1.0, 1.0], ([2.0, 2.0],))], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', [('vel', '<f4', (2,))])]) 

おっとを - 私は、ネストのフィールドを取得しています。元の例に戻ります。目標を作成し、名前で記入してください。

merge_arraysは良くありません - フラット化

In [247]: rf.merge_arrays((arr,x),flatten=True) 
Out[247]: 
array([(1.0, [1.0, 1.0, 1.0], [2.0, 2.0]), 
     (1.0, [1.0, 1.0, 1.0], [2.0, 2.0]), 
     (1.0, [1.0, 1.0, 1.0], [2.0, 2.0])], 
     dtype=[('afield', '<f4'), ('pos', '<f4', (3,)), ('vel', '<f4', (2,))]) 

を作成し、多くの場合、記入

In [248]: dx = [('f0','f',(2,))] 
In [250]: y=np.zeros((3,), dtype=dx) 
In [251]: y['f0'] = np.arange(6.).reshape(3,2) 

その新しいフィールドに適切な配列を作成するもう一つの方法は、これらの複雑で構造化させる最良の方法であると思われますアレイ。

0

は正しい方向への一歩です:

残念ながら
data = arr['pos'] 
data = np.ascontiguousarray(data) # next line fails otherwise - bug? 
data = data.view([('vel', (np.float, 3))]) 
data = data.reshape(data.shape[:-1]) # view doesn't ever remove a dimension 
assert data.shape == (10,) 

、あなたが今やるとき:

new_arr = append_fields(arr, 'vel', data,usemask=False) 

あなたはnew_arr['vel']['vel']

関連する問題