2017-05-06 7 views
0

Ich möchte die folgende Operation in Python automatisieren. Gegeben ein n-dimensionales np.array, z.B.Automatisches Umschalten der Dimension bei der Array-Indizierung (Python)

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

Mit Namen für jede der Dimensionen in dim_names, z.

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

Wählen Sie alle Randwerte einer beliebigen Dimension, z.

ind = dim_names.index('B') 

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

Aber je nach ind die Indizierung ändern ist, beispielsweise für ind = 0 benötigen wir ar[i,:,:] oder ind = 2ar[:,:,i]. Außerdem sollte es für ein Array mit einer beliebigen Anzahl von Dimensionen funktionieren.

Antwort

1

Möglicherweise gibt es einen besseren Ansatz für Ihr Problem, aber wie für die Frage können Sie den Index dynamisch in Schleife erstellen, d. H. Die gewünschte Dimension des Index und Slice angeben.

Scheibe entlang der ersten Dimension:

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]] 

Scheibe entlang der zweiten Dimension:

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]] 

Scheibe entlang der dritten Dimension:

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]] 
Verwandte Themen