2017-09-28 13 views
1

ある場所を選択しますが、私は、多次元マトリックスにnumpyの:インデックスが同じ

A = np.ones((5, 10, 5, 10, 2, 3)) 

を持って、今、私は最初の次元のインデックスが三次元に等しいすべての項目を選択してみたいと思います。それは私が

A[0, :, 0, ...] 
A[1, :, 1, ...] 
A[2, :, 2, ...] 

を持ちたいというように....それをする

複雑な(しかし、私には知られている)の方法は、インデックスを超える関数meshgridを作成することで、その後に基づいて選択、ですそれらは:

i1, i2, i3, i4, i5, i6 = np.meshgrid(range(5), range(10), range(5), range(10), range(2), range(3), indexing='ij') 

A[i1 == i3].shape 
Out[29]: (3000,) 
A[i1 == i2].shape 
Out[31]: (1500,) 

しかし、これはこれを行う非常に退屈な方法です。インデックスに基づいて選択する簡単な方法はありますか?私は同時に2つの指標に選択することになる方法

ボーナス質問

?すなわち

A[(i1 == i3) and (i2 == i4)] 

答えて

1

advanced-indexingと非常にシンプルであるべき(シンプルで...うーん、一緒に進ん) -

r = np.arange(a.shape[0]) 
out = a[r,:,r] 

サンプルが

1を実行します)3Dデータ:

In [380]: a 
Out[380]: 
array([[[4, 6, 4, 8], 
     [0, 4, 5, 2], 
     [2, 5, 6, 7]], 

     [[0, 0, 4, 6], 
     [1, 7, 4, 3], 
     [4, 2, 0, 1]]]) 

In [381]: a[0,:,0] 
Out[381]: array([4, 0, 2]) 

In [382]: a[1,:,1] 
Out[382]: array([0, 7, 2]) 

In [383]: r = np.arange(a.shape[0]) 

In [384]: a[r,:,r] 
Out[384]: 
array([[4, 0, 2], 
     [0, 7, 2]]) 

2)4Dデータ:

In [385]: a = np.random.randint(0,9,(2,2,3,4)) 

In [386]: a[0,:,0,:] 
Out[386]: 
array([[0, 4, 1, 8], 
     [1, 2, 2, 3]]) 

In [387]: a[1,:,1,:] 
Out[387]: 
array([[7, 8, 3, 8], 
     [0, 1, 4, 7]]) 

In [388]: r = np.arange(a.shape[0]) 

In [389]: a[r,:,r] 
Out[389]: 
array([[[0, 4, 1, 8], 
     [1, 2, 2, 3]], 

     [[7, 8, 3, 8], 
     [0, 1, 4, 7]]]) 

ボーナス部:単純に(再び)索引付けするための2つの範囲の配列を使用するが、上の最初のものを取得することにより、互いに直交寸法

二組から選択他の軸はペアリングを許可してインデックスを作成します。 -

r1 = np.arange(a.shape[0])[:,None] 
r2 = np.arange(a.shape[1]) 
out = a[r1,r2,r1,r2] 

サンプル実行 -

In [464]: a = np.random.randint(11,99,(3,2,3,2)) 

In [470]: for i in range(3): 
    ...:  for j in range(2): 
    ...:   print a[i,j,i,j] 
    ...:   
34 
12 
30 
20 
93 
76 

In [471]: r1 = np.arange(a.shape[0])[:,None] 
    ...: r2 = np.arange(a.shape[1]) 
    ...: out = a[r1,r2,r1,r2] 
    ...: 

In [472]: out 
Out[472]: 
array([[34, 12], 
     [30, 20], 
     [93, 76]]) 
+0

これまでのところよく見えます。私は最終的に、同時に2つの次元を選択しようとしています - 簡単にするためにそれを公開しませんでしたが、 '' [r1、r2、r1、r2、...]あなたもそのことを推測していますか? (編集された質問を参照) – FooBar

+0

@FooBar編集をチェックしてください。 – Divakar

関連する問題