2016-06-30 12 views
1

私はnumpyの構造化配列をスライスしたいと思います。 私は、アレイnumpy構造化配列のすべての列を取得します。

>>b 
>>array([([11.0, 21.0, 31.0, 0.01], [1.0, 2.0, 3.0, 0.0]), 
     ([41.0, 51.0, 61.0, 0.11], [4.0, 5.0, 6.0, 0.1]), 
     ([71.0, 81.0, 91.0, 0.21], [7.0, 8.0, 9.0, 0.2])], 
     dtype=[('fd', '<f8', (4,)), ('av', '<f8', (4,))]) 

を持っていると私は、これに似た配列を取得するために

>>b[:][:,0] 

に類似した新しい配列を作成するには、このの要素にアクセスしたいです。 ([0]にあるすべての列のすべての行を取得する)。 (これは出力されませんよう、以下に括弧、ブラケットと寸法を気にしないでください)

>>array([([11.0],[1.0]), 
    ([41.0],[4.0]), 
    ([71.0],[7.0])], 
    dtype=[('fd', '<f8', (1,)), ('av', '<f8', (1,))]) 

が、私はこのエラーを取得します。

>>b[:][:,0] 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    IndexError: too many indices for array 

私はdtypeで名前をループせずにこれを行いたいと思います。 ありがとうございました。

答えて

2

構造化配列の項目には、項目名でアクセスします。これを回避する方法はありません。 dtypesが別の方法でそれを見ることができない限り。

希望の出力をcとしましょう。

In [1062]: b['fd'][:,0] 
Out[1062]: array([ 11., 41., 71.]) 

In [1064]: c['fd'] 
Out[1064]: 
array([[ 11.], 
     [ 41.], 
     [ 71.]]) 

私はちょうどrecfunctionsは、一般に、標的配列を割り当てると、フィールドで値をコピーhttps://stackoverflow.com/a/38090370/901925で説明したように:私はあなたがやろうとしていると思う何

In [1061]: b['fd'] 
Out[1061]: 
array([[ 1.10000000e+01, 2.10000000e+01, 3.10000000e+01, 
      1.00000000e-02], 
     [ 4.10000000e+01, 5.10000000e+01, 6.10000000e+01, 
      1.10000000e-01], 
     [ 7.10000000e+01, 8.10000000e+01, 9.10000000e+01, 
      2.10000000e-01]]) 

は、両方のフィールドにこれらの値を収集しています。

だから、フィールド反復ソリューションは、のようになります。両方のフィールド山車以来

In [1066]: c.dtype 
Out[1066]: dtype([('fd', '<f8', (1,)), ('av', '<f8', (1,))]) 

In [1067]: b.dtype 
Out[1067]: dtype([('fd', '<f8', (4,)), ('av', '<f8', (4,))]) 

In [1068]: d=np.zeros((b.shape), dtype=c.dtype) 


In [1070]: for n in b.dtype.names: 
    d[n][:] = b[n][:,[0]] 

In [1071]: d 
Out[1071]: 
array([([11.0], [1.0]), ([41.0], [4.0]), ([71.0], [7.0])], 
     dtype=[('fd', '<f8', (1,)), ('av', '<f8', (1,))]) 

================

を、私は見ることができます2次元配列としてb;および2D配列のインデックスとの2つのサブカラム選択:

In [1083]: b.view((float,8)).shape 
Out[1083]: (3, 8) 

In [1084]: b.view((float,8))[:,[0,4]] 
Out[1084]: 
array([[ 11., 1.], 
     [ 41., 4.], 
     [ 71., 7.]]) 

同様に、cが2D

In [1085]: c.view((float,2)) 
Out[1085]: 
array([[ 11., 1.], 
     [ 41., 4.], 
     [ 71., 7.]]) 

と見なすことができると私ができ、ブランクdに、ポート値:

In [1090]: d=np.zeros((b.shape), dtype=c.dtype) 

In [1091]: d.view((float,2))[:]=b.view((float,8))[:,[0,4]] 

In [1092]: d 
Out[1092]: 
array([([11.0], [1.0]), ([41.0], [4.0]), ([71.0], [7.0])], 
     dtype=[('fd', '<f8', (1,)), ('av', '<f8', (1,))]) 

少なくとも、この場合、フィールドバイステップでコピーする必要はありません。しかし、私はテストなしでは、より速いとは言えません。私の以前の答えでは、フィールドごとのコピーは、多くの行を処理するときに比較的高速であることがわかりました。

+0

あなたはどのようにcを持っているか説明できますか?私はそれを見つけるように見えない。ありがとう – ssm

+0

'c'はポストからあなたの' 'array([([11.0]、[1.0])、...( 'av'、 ' hpaulj

+0

私はビューを使ってコピーを行う方法を理解しました。 – hpaulj

関連する問題