2016-04-05 33 views
2

内の重複フィールドでnp.array構築:次のように私はDTYPEを持ってDTYPE

pose_dtype = np.dtype([('x', np.float64), ('y', np.float64), ('theta', np.float64)]) 

を今、私が書くことができます:

pose = np.array((1, 2, np.pi), dtype=pose_dtype) 

を私がするxyフィールドを追加したいですこれを使いやすくする。私はこれを行うことができます。

pose_dtype = np.dtype(dict(
    names=['x', 'y', 'theta', 'xy'], 
    formats=[np.float64, np.float64, np.float64, (np.float64, 2)], 
    offsets=[0, 8, 16, 0] 
)) 

はしかし、今私はもはや私の以前の方法を使用してアレイを構築していない、とに頼ることができます:危険な繰り返しである

pose = np.array((1, 2, np.pi, [1, 2]), dtype=pose_dtype) 

私はこれを処理する必要がないように、プロパティを別名としてマークする方法はありますか?

+0

方法レコードよりもむしろ? 'dtype''offsets'はSOに関するかなり稀な話題です。私は代替案を見つけるために実験をしなければならないでしょう。 – hpaulj

+0

しかし、あなたは 'pose [['x'、 'y']]'によって複数のフィールドにアクセスできることを知っていますか?エイリアシングなし。 – MSeifert

+0

@MSeifert:その結果、構造化されていないものではなく、構造化された型が得られます。つまり、 – Eric

答えて

1
フィールドで配列を埋めるについての配列を埋めるで

実験フィールドによってではなく、レコード

In [207]: pose_dtype = np.dtype(dict(
    names=['x', 'y', 'theta', 'xy'], 
    formats=[np.float64, np.float64, np.float64, (np.float64, 2)], 
    offsets=[0, 8, 16, 0] 
)) 

In [209]: A=np.zeros((3,),dtype=pose_dtype) 
In [210]: A 
Out[210]: 
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])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 
In [211]: A['x']=[1,2,3] 
In [212]: A 
Out[212]: 
array([(1.0, 0.0, 0.0, [1.0, 0.0]), (2.0, 0.0, 0.0, [2.0, 0.0]), 
     (3.0, 0.0, 0.0, [3.0, 0.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 
In [213]: A['y']=[4,5,6] 
In [214]: A 
Out[214]: 
array([(1.0, 4.0, 0.0, [1.0, 4.0]), (2.0, 5.0, 0.0, [2.0, 5.0]), 
     (3.0, 6.0, 0.0, [3.0, 6.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 
In [215]: A['xy'] 
Out[215]: 
array([[ 1., 4.], 
     [ 2., 5.], 
     [ 3., 6.]]) 
In [216]: A['xy']=np.arange(10,16).reshape(3,2) 
In [217]: A 
Out[217]: 
array([(10.0, 11.0, 0.0, [10.0, 11.0]), (12.0, 13.0, 0.0, [12.0, 13.0]), 
     (14.0, 15.0, 0.0, [14.0, 15.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 

In [219]: A['xy'].dot(A['xy'].T) 
Out[219]: 
array([[ 221., 263., 305.], 
     [ 263., 313., 363.], 
     [ 305., 363., 421.]]) 

によってfloat配列(ないきれい)として2つのフィールドを取得する別の方法

In [228]: A[['x','y']].view(float).reshape(-1,2) 
Out[228]: 
array([[ 10., 11.], 
     [ 12., 13.], 
     [ 14., 15.]]) 
+1

'x2 [['x'、 'y']]の結果に' np.dot'を使うことはできません。 view((np.float64,2)) '2つのフィールドを取得するときの仕事は、 – Eric

+0

です。私は' view'にそのような複合dtypeを使うことは考えていませんでした。スピードは同じですが、「変形」の厄介さを取り除きます。あなたの「xy」フィールドへのアクセスはより高速です。 – hpaulj

関連する問題