Tensorflow: how to index a tensor using a 2D index, as in numpy

I would like to make the following numpy code in Tensorflow:

input = np.array([[1,2,3]
                  [4,5,6]
                  [7,8,9]])
index1 = [0,1,2]
index2 = [2,2,0]
output = input[index1, index2]
>> output
[3,6,7]

given input, for example:

input = tf.constant([[1, 2, 3],
                     [4, 5, 6],
                     [7, 8, 9]])

I tried the following, but it seems to exceed:

index3 = tf.range(0, input.get_shape()[0])*input.get_shape()[1] + index2
output = tf.gather(tf.reshape(input, [-1]), index3)
sess = tf.Session()
sess.run(output)
>> [3,6,7]

This only works because my first index is convenient [0,1,2], but not feasible for [0,0,2], for example (except that it looks very long and ugly).

Will you have a simpler syntax, something more tensor / pythonic?

+4
source share
2 answers

You can do this using tf.gather_nd (tf.gather_nd official doc) as follows:

import tensorflow as tf
inp = tf.constant([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
res=tf.gather_nd(inp,list(zip([0,1,2],[2,2,0])))
sess = tf.Session()
sess.run(res)

Result array([3, 6, 7])

+4
source

tf.gather_nd?

In [61]: input = tf.constant([[1, 2, 3],
    ...:                      [4, 5, 6],
    ...:                      [7, 8, 9]])

In [63]: row_idx = tf.constant([0, 1, 2])
In [64]: col_idx = tf.constant([2, 2, 0])
In [65]: coords = tf.transpose(tf.pack([row_idx, col_idx]))

In [67]: sess = tf.InteractiveSession()

In [68]: tf.gather_nd(input, coords).eval()
Out[68]: array([3, 6, 7], dtype=int32)
+3

Source: https://habr.com/ru/post/1673728/


All Articles