2017-10-02 10 views
0

高度なインデックスを使用して、3つのわずかに異なる方法で3D配列をスライスして、同じ結果を得るPythonプログラムです。 aとbは同じ期待される結果を示す。しかし、cは "IndexError:shape mismatch:インデックス配列をshape(3、)(2、)(1、)と一緒にブロードキャストできませんでした"というエラーメッセージを表示します。 a、b、cの唯一の違いは、第2のインデックスの範囲を選択するわずかに異なる方法です。興味深いnumpy先進的なインデックスの選択の場合

import numpy as np 

y = np.arange(0,18) 
y1 = y.reshape((3,2,3)) 

print("y1 is \n{}\n".format(y1)) 

#a is ok 
a = y1[[0,1,2],:,[False,False,True]] 
print("a is \n{}\n".format(a)) 

#b is ok, same as a 
b = y1[[0,1,2],0:2,[False,False,True]] 
print("b is \n{}\n".format(b)) 

#below errors out 
c = y1[[0,1,2],[0,1],[False,False,True]] 
print("c is \n{}\n".format(c)) 
+0

最後のケースでは 'ix_'放送が必要です。真ん中の1つのスライスはシェイプオーダーを混乱させる可能性があります。これは、先進的な/基本的なインデックス作成の複合的なケースです。 '[:、:、[2]]を参照してください。 – hpaulj

+0

numpyは、リストまたはスライスオブジェクトに遭遇するかどうかによって、そのインデックス動作を変更します。あなたはドキュメントのファンシーインデックスセクションでそれについて読むことができます。 – percusse

答えて

0

をインデックス1に少し混乱したように、インデックス0とTrueとしてFalse使用:理由をerroring℃です。

a = y1[[0,1,2],:,[False,False,True]] 

以上

a = y1[[0,1,2],:,[0,0,1]] 

手段、第2の要素、指標としてcの場合...

a = [y1[0, :, 0], y1[1, :, 0], y1[2, :, 1]] 

を各リストの最初の要素を取ります中間リストが短く、3番目の要素が欠落しています。

別の例として、それを明確に

d = y1[[0,2,0],[0,1,0],[2,2,1]] 

作るためにここに

d = [y1[0, 0, 2], y1[2, 1, 2], y1[0, 0, 1]] 
+0

この場合、ブールインデックスは[0,0,1]ではなく、[2]と同じです。最後の次元で1列を選択します。 – hpaulj

+0

@hpaulj:この場合、それはまさに私が書いたものです。それを自分でテストしてください。 – Daniel

+0

ブールインデックスを使って、私は 'y1 [:、:、、2]'と等価になります。 – hpaulj

0

問題があるさ:ブーリアンインデックスが

  • どのようにインデックスリスト(配列をどのように動作するか

    • )お互いにブロードキャスト
    • 複合型の高度な/基本的なインデックス作成の仕組み

    In [286]: y1 = np.arange(18).reshape(3,2,3) 
    In [287]: y1 
    Out[287]: 
    array([[[ 0, 1, 2], 
         [ 3, 4, 5]], 
    
         [[ 6, 7, 8], 
         [ 9, 10, 11]], 
    
         [[12, 13, 14], 
         [15, 16, 17]]]) 
    In [288]: y1[[0,1,2],:,[False, False, True]] 
    Out[288]: 
    array([[ 2, 5], 
         [ 8, 11], 
         [14, 17]]) 
    In [289]: y1[[0,1,2],0:2,[False, False, True]] 
    Out[289]: 
    array([[ 2, 5], 
         [ 8, 11], 
         [14, 17]]) 
    In [290]: y1[[0,1,2],[0,1],[False, False, True]] 
    .... 
    IndexError: shape mismatch: indexing arrays could not be 
    broadcast together with shapes (3,) (2,) (1,) 
    

    したがって、最初の2は、(3,2)結果を生成し、エラー最後。最後は[False,False,True]を(1、)インデックス配列に変換したことに注意してください。

    最初

    は、このシンプルなインデックスと同じである:(3,2,1)

    In [291]: y1[:,:,[False,False,True]] 
    Out[291]: 
    array([[[ 2], 
         [ 5]], 
    
         [[ 8], 
         [11]], 
    
         [[14], 
         [17]]]) 
    

    A:私はブール値を使用する代わりに、場合

    In [294]: y1[:,:,2] 
    Out[294]: 
    array([[ 2, 5], 
         [ 8, 11], 
         [14, 17]]) 
    

    、それは私がy1[:,:,[2]]]を使用しているかのようですアレイ。

    y1[np.ix_([0,1,2], [0,1], [2])]では、同じことが行われますが、高度なインデックス作成が行われます。 booleanリストも同じように動作します。彼らはこれが(にブロードキャスト(3,1,1)、(1,2,1)及び(1,1,1)を作成互いに

    In [299]: np.ix_([0,1,2],[0,1],[2]) 
    Out[299]: 
    (array([[[0]], 
    
         [[1]], 
    
         [[2]]]), array([[[0], 
         [1]]]), array([[[2]]])) 
    

    に対してブロードキャストできるようix_ 3つのアレイを整形します3,2,1)。

    y1[[0,1,2], :, [2]]は、(3、)を生成するためにa(1、)でa(3、)を使用します。中間の(2、)中間の端が最後まで付いています。これは、基本的な/高度な索引付けが混在した例です。場合によっては直感的ではありません。たとえば、y1[[2], :, [0,1,2]]は(3,2)を生成しますが、ユーザーはしばしば(2,3)を期待します。

    Python multi-dimensional notation transpose automatically


    ブールインデックスは0/1インデックスと同じではありません。

    In [297]: y1[[0,1,2], :, [0,0,1]] 
    Out[297]: 
    array([[ 0, 3], 
         [ 6, 9], 
         [13, 16]]) 
    

    これはy1[0,:,0]y1[1,:,0]、およびy1[2,:,1]を選択します。 2つのリストの要素をペアにします。 a(3、)でa(3、)をブロードキャストします。再び中央のスライスが最後に追加されます。


    [0,2]の同等、サイズ(2,)インデックスであることが[True, False, True]た場合はブール値マスクは問題を抱えていることができることを注意、。それは(3,)で放送されません。

    In [307]: y1[[0,1,2],:,[True, False, True]] 
    IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,) 
    

    y1[[[0],[1],[2]],:,[True, False, True]](3,2,2)結果、および y1[[[0],[1],[2]],[0,1],[True, False, True]](3,2)とご理解をテストします。

  • 関連する問題