2017-05-06 5 views
0

Pythonで次の操作を自動化したいと思います。 n次元のnp.arrayが与えられると、配列インデックス(Python)の次元を自動的に切り替える

ar = np.array([[[ 8, 10], 
       [ 9, 11], 
       [10, 12]], 
       [[ 9, 11], 
       [10, 12], 
       [11, 13]]]) 

dim_namesの各次元の名前があります。

dim_names = ['A','B','C'] 

任意の次元のすべての余白を選択します。

ind = dim_names.index('B') 

for i in range(ar.shape[ind]): 
    print(ar[:,i,:]) 

しかしindに応じて、インデックスは、例えば、変更する必要がありますind = 0については、ar[i,:,:]またはind = 2ar[:,:,i]が必要です。さらに、任意の数のディメンションの配列に対して機能するはずです。

答えて

1

あなたの問題にはより良いアプローチがあるかもしれませんが、質問については、ループでインデックスを動的に構築することができます。つまり、インデックスとスライスの望ましい次元を指定します。

第一の次元に沿ってスライス:第二の次元に沿って

ind = 0 
​ 
for i in range(ar.shape[ind]): 
    idx = [slice(None)] * ar.ndim    # inintialize the index with the same length 
               # as the dimensions 
    idx[ind] = i        # modify the index of the desired dimension 
    print(ar[tuple(idx)]) 

#[[ 8 10] 
# [ 9 11] 
# [10 12]] 
#[[ 9 11] 
# [10 12] 
# [11 13]] 

スライス:第三の次元に沿っ

ind = 1 
​ 
for i in range(ar.shape[ind]): 
    idx = [slice(None)] * ar.ndim 
    idx[ind] = i 
    print(ar[tuple(idx)]) 

#[[ 8 10] 
# [ 9 11]] 
#[[ 9 11] 
# [10 12]] 
#[[10 12] 
# [11 13]] 

スライス:

ind = 2 
​ 
for i in range(ar.shape[ind]): 
    idx = [slice(None)] * ar.ndim 
    idx[ind] = i 
    print(ar[tuple(idx)]) 

#[[ 8 9 10] 
# [ 9 10 11]] 
#[[10 11 12] 
# [11 12 13]] 
関連する問題