2017-05-25 12 views
1

ケース1(解決済み):アレイAは形状(例えば、300,50)を持っています。配列Bは、の横に「concate」する別の行のインデックスをi行に示すように、形状(300,5)を持つインデックス配列です。最終結果は、形状が(300,5,50)の配列Cであり、C[i,j,:] = A[B[i,j],:]です。これはA[B,:]を呼び出すことによって行うことができます。ナンシー・アドバンスド・インデックスの使用

import numpy as np 

## A is the data array 
A = np.arange(20).reshape((5,4)) 
## B indicate for each row which rows to pull together 
B = np.array([[0,2],[1,2],[2,0],[3,4],[4,1]]) 
A[B,:] #The desired result 

ケース2(未解決):今だけAが(100,300,50)成形され同じ問題、

ここで、ケース1のための小さなスクリプト例です。 Bが指標行列形状(100,300,5)である場合、最終結果は形状が(100,300,5,50)の配列Cであり、C[i,j,k,:] = A[i,B[i,j,k],:]となります。 A[B,:]は、放送のために形状(100,300,5,300,50)になってしまったため、もう動作しません。

インデックスを作成するにはどうすればよいですか?

答えて

2

1つの方法は、列の数をそのまま維持し、フラットなBインデックスを使用して最初の軸にインデックスを付け、最後に目的のインデックスに再シェイプすることです。

A.reshape(-1,A.shape[-1])[B.ravel()].reshape(100,300,5,50) 

整形され、単に配列に視聴者は、非常に効率的であるべきである -

従って、実装があろう。

これにより、両方のケースが解決されます。ここではサンプル実行は、ケース#1のためだ -

1)入力:

In [667]: A = np.random.rand(3,4) 
    ...: B = np.random.randint(0,3,(3,5)) 
    ...: 

2)オリジナルの方法:

In [668]: A[B,:] 
Out[668]: 
array([[[ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.45, 0.16, 0.02, 0.02], 
     [ 0.1 , 0.91, 0.1 , 0.98]], 

     [[ 0.45, 0.16, 0.02, 0.02], 
     [ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.45, 0.16, 0.02, 0.02]], 

     [[ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.45, 0.16, 0.02, 0.02], 
     [ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.45, 0.16, 0.02, 0.02], 
     [ 0.45, 0.16, 0.02, 0.02]]]) 

3)提案手法:ワンダフル

In [669]: A.reshape(-1,A.shape[-1])[B.ravel()].reshape(3,5,4) 
Out[669]: 
array([[[ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.45, 0.16, 0.02, 0.02], 
     [ 0.1 , 0.91, 0.1 , 0.98]], 

     [[ 0.45, 0.16, 0.02, 0.02], 
     [ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.1 , 0.91, 0.1 , 0.98], 
     [ 0.45, 0.16, 0.02, 0.02]], 

     [[ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.45, 0.16, 0.02, 0.02], 
     [ 0.48, 0.6 , 0.96, 0.21], 
     [ 0.45, 0.16, 0.02, 0.02], 
     [ 0.45, 0.16, 0.02, 0.02]]]) 
+0

!事例2は、指標が相対的な位置を表しているため、それらを平坦化するときにグローバルに移動する必要があるため、修正が必要です。私がしたことは、 'B_new = B +(B.shape [1] * np.arange(B.shape [0]))[:, np.newaxis、np.newaxis]'です。しかし、このトリックは私の問題を解決しました!ありがとう。 – YotamH

関連する問題