Intercambiar elementos dentro de una matriz de filas y columnas – TensorFlow scatter_nd

Estoy tratando de usar la función scatter_nd en TensorFlow para reordenar los elementos dentro de las filas de una matriz. Por ejemplo, supongamos que tengo el código:

indices = tf.constant([[1],[0]]) updates = tf.constant([ [5, 6, 7, 8], [1, 2, 3, 4] ]) shape = tf.constant([2, 4]) scatter1 = tf.scatter_nd(indices, updates, shape) $ print(scatter1) = [[1,2,3,4] [5,6,7,8]] 

Esto reordena las filas de la matriz de updates .

En lugar de solo poder reordenar las filas, también me gustaría reordenar los elementos individuales dentro de cada fila. Si solo tengo un vector (Tensor de rango 1), entonces este ejemplo funciona:

 indices = tf.constant([[1],[0],[2],[3]]) updates = tf.constant([5, 6, 7, 8]) shape = tf.constant([4]) scatter2 = tf.scatter_nd(indices, updates, shape) $ print(scatter2) = [6,5,7,8] 

Lo que realmente me importa es poder intercambiar elementos dentro de cada fila en scatter1 , como lo había hecho en scatter2 , pero hacerlo para cada fila de scatter1 . He intentado varias combinaciones de indices pero sigo obteniendo errores de que los tamaños son inconsistentes lanzados por la función scatter_nd .

Lo siguiente intercambia los elementos de cada fila de cada fila usando scatter_nd

 indices = tf.constant([[[0, 1], [0, 0], [0, 2], [0, 3]], [[1, 1], [1, 0], [1, 2], [1, 3]]]) updates = tf.constant([ [5, 6, 7, 8], [1, 2, 3, 4] ]) shape = tf.constant([2, 4]) scatter1 = tf.scatter_nd(indices, updates, shape) with tf.Session() as sess: print(sess.run(scatter1)) 

Dando una salida de:
[[6 5 7 8] [2 1 3 4]]

Las ubicaciones de las coordenadas en los indices definen de dónde se toman los valores en las updates y las coordenadas reales definen dónde se colocarán los valores en scatter1 .

Esta respuesta llega unos meses tarde pero espero que sea útil.

Supongamos que desea intercambiar elementos en la segunda dimensión manteniendo el primer orden de dimensión o no.

 import tensorflow as tf sess = tf.InteractiveSession() def prepare_fd(fd_indices, sd_dims): fd_indices = tf.expand_dims(fd_indices, 1) fd_indices = tf.tile(fd_indices, [1, sd_dims]) return fd_indices # define the updates updates = tf.constant([[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]]) sd_dims = tf.shape(updates)[1] sd_indices = tf.constant([[1, 0, 2, 3], [0, 2, 1, 3], [0, 1, 3, 2]]) fd_indices_range = tf.range(0, limit=tf.shape(updates)[0]) fd_indices_custom = tf.constant([2, 0, 1]) # define the indices indices1 = tf.stack((prepare_fd(fd_indices_range, sd_dims), sd_indices), axis=2) indices2 = tf.stack((prepare_fd(fd_indices_custom, sd_dims), sd_indices), axis=2) # define the shape shape = tf.shape(updates) scatter1 = tf.scatter_nd(indices1, updates, shape) scatter2 = tf.scatter_nd(indices2, updates, shape) print(scatter1.eval()) # array([[12, 11, 13, 14], # [21, 23, 22, 24], # [31, 32, 34, 33]], dtype=int32) print(scatter2.eval()) # array([[21, 23, 22, 24], # [31, 32, 34, 33], # [12, 11, 13, 14]], dtype=int32) 

Que este ejemplo ayude.