2017-09-26 1 views
1

Ich habe 2 numpy Arrays output und index:Füllen Sie ein 3D-numpy Array mit denen auf einem 2D-Array basierten mit Indizes

output = np.zeros((3,3,3)) 

>>>index 
array([[0,1,2], 
     [1,0,0], 
     [2,2,2]]) 

index stellt den Index bis zu dem output sollten mit denen in der ersten Dimension aufgefüllt werden. Der bestückte Wert von output sollte wie folgt aussehen:

>>>output 
array([[[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 
     [[0, 1, 1], 
     [1, 0, 0], 
     [1, 1, 1]], 
     [[0, 0, 1], 
     [0, 0, 0], 
     [1, 1, 1]]] 

Da zum Beispiel index[0, 1] == 1 setzten wir output[:1+1, 0, 1] = 1. Im Allgemeinen, wenn index[i, j] == k, setzen wir output[:k+1, i, j] = 1.

Kann jemand das vektorisiert erreichen?

Antwort

2

Mit NumPy broadcasting wir eine Maske dieser Orte schaffen. So konvertieren einfach diese Maske in ein int-Array von 0s und 1s, wie so -

(index >= np.arange(3)[:,None,None]).astype(int) 

Probelauf -

In [471]: index 
Out[471]: 
array([[0, 1, 2], 
     [1, 0, 0], 
     [2, 2, 2]]) 

In [472]: (index >= np.arange(3)[:,None,None]).astype(int) 
Out[472]: 
array([[[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 

     [[0, 1, 1], 
     [1, 0, 0], 
     [1, 1, 1]], 

     [[0, 0, 1], 
     [0, 0, 0], 
     [1, 1, 1]]]) 

Alternativ in output zuzuweisen, verwenden Sie die Maske für boolean-indexing und weisen 1s -

output[index >= np.arange(output.shape[0])[:,None,None]] = 1 
0

Sie können 1 auf die letzte Position (entlang der ersten Dimension) zuweisen dann 0 füllen zurück mit 1 np.maximum.accumulate mit:

output[index, np.arange(output.shape[1])[:,None], np.arange(output.shape[2])] = 1 
np.maximum.accumulate(output[::-1], axis=0)[::-1] 

#array([[[ 1., 1., 1.], 
#  [ 1., 1., 1.], 
#  [ 1., 1., 1.]], 

#  [[ 0., 1., 1.], 
#  [ 1., 0., 0.], 
#  [ 1., 1., 1.]], 

#  [[ 0., 0., 1.], 
#  [ 0., 0., 0.], 
#  [ 1., 1., 1.]]]) 
Verwandte Themen