2017-12-04 2 views
2

I spezifische Vektoren in einem 3D-Tensor ändern möchte bestimmte Scheiben maskieren, nach einer Liste von Positionen (Indizes):Wie für jede Zeile in einem Tensor

#indices: 1D vector of positions, indices.shape: (k) 

mask = np.zeros(k, n, m) 
for i in range(k): 
    mask[i][indices[i]] = 1 

Diese Maske angewandt werden soll ein weiterer 3D-Tensor (gleiche Form), in dem ich bestimmte Vektoren erhalten und den Rest null machen möchte.

Was ist der beste Weg, um eine solche Maske in TensorFlow zu konstruieren? Ich kann es mit einer Schleife machen, indem ich eine Zuweisungsoperation verwende, aber ich würde gerne eine elegantere Lösung finden. Vielleicht mit tf.scatter_nd?

EDIT: Beispiel: -

np.tile((indices[:,None,None] == np.arange(n)[:,None]), m) 

Probelauf -

>>> mask_before 
array([[[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]], 

     [[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]], 

     [[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]]) 

>>> indices 
array([2, 1, 4]) 

>>> mask_after 
array([[[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 1., 1., 1., 1.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]], 

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

     [[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 1., 1., 1., 1.]]]) 
+0

bitte – MaxU

+0

@MaxU gesetzt Beispieldatensätze und Ihre gewünschten Daten zur Verfügung stellen, nehmen Sie bitte einen Blick – MichaelSB

Antwort

1

Eine vektorisiert Weise Dimensionen würden und somit Hebel broadcasting erweitert

In [755]: # Sample Setup 
    ...: indices = np.array([2,3,1]) 
    ...: 
    ...: k = 3 
    ...: n = 4 
    ...: m = 2 
    ...: mask = np.zeros((k, n, m),dtype=bool) 
    ...: for i in range(k): 
    ...:  mask[i][indices[i]] = 1 

In [756]: out = np.tile((indices[:,None,None] == np.arange(n)[:,None]), m) 

In [757]: np.allclose(out, mask) 
Out[757]: True 

Um den Port über tensorflow, Wir haben die Gegenstücke dort:

tf.expand_dims und tf.tile.

1

Hier ist der entsprechende TF-Code für Divakar Antwort:

indices = tf.constant([2,1,4]) 
a1 = tf.expand_dims(indices, axis=1) 
a1 = tf.expand_dims(a1, axis=1) 
a2 = tf.range(5) 
a2 = tf.expand_dims(a2, axis=1) 
a3 = tf.equal(a1, a2) 
mask = tf.tile(a3, [1,1,4]) 


>>> tf.cast(mask, dtype=tf.int8) 
<tf.Tensor: id=55, shape=(3, 5, 4), dtype=int8, numpy= 
array([[[0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [1, 1, 1, 1], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0]], 

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

    [[0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [1, 1, 1, 1]]], dtype=int8)> 
Verwandte Themen