An array has at least one maximum element . in its simplest case gives the index of this maximum element, so that . The Tensorflow argmax requires you to designate one dimension of your tensor to act as that array.

import tensorflow as tf sess = tf . InteractiveSession () # Since x[3] is the largest number(4), argmax(x) is 3 x = [ 1 , 2 , 3 , 4 , 3 , 2 , 1 ] tf . argmax ( x , axis = 0 ) . eval () # 3 # Axis 1 will apply argmax to the rows # Axis 0 will apply argmax to the columns x = [[ 1 , 2 , 3 , 4 , 3 , 2 , 1 ], [ 2 , 3 , 4 , 3 , 2 , 1 , 0 ]] tf . argmax ( x , axis = 0 ) . eval () # [3,2] tf . argmax ( x , axis = 1 ) . eval # [1,1,1,0,0,0,0]

Once you have some indices, you can convert them to values using gather. gather in its simplest case is equivalent to doing an array lookup: .

import tensorflow as tf sess = tf . InteractiveSession # A scalar index of a vector is a scalar. # 3 is the index of 4, so gathering 3 is 4. x = [ 1 , 2 , 3 , 4 , 3 , 2 , 1 ] tf . gather ( x , 3 ) . eval () # 4 # A scalar index of a matrix x is a vector. # Row 0 of x is [1,2,3,4,3,2,1], so gathering 0 returns it. x = [[ 1 , 2 , 3 , 4 , 3 , 2 , 1 ], [ 2 , 3 , 4 , 3 , 2 , 1 , 0 ]] tf . gather ( x , 0 ) . eval () # [1,2,3,4, 3, 2, 1] # Gathering a vector index produces a scalar index for each element of the vector, and then concatenates them. # Gathering [1,0] produces row 1 and row 0. Concatenating them flips the rows in the original matrix. tf . gather ( x , [ 1 , 0 ]) . eval () # [[ 2,3,4,3,2,1,0], [ 1 , 2 , 3 , 4 , 3 , 2 , 1 ]] # In general, each scalar index within the index tensor will produce an entire row in x. tf . gather ( x , [[[ 1 ]],[[ 0 ]]]) . eval () # [[[2,3,4,3,2,1,0]], [[ 1 , 2 , 3 , 4 , 3 , 2 , 1 ]]]

gather assumes that each scalar is an index along the first dimension. You can use gather_nd to target other values:

import tensorflow as tf sess = tf . InteractiveSession () x = [[ 1 , 2 , 3 , 4 , 3 , 2 , 1 ], [ 2 , 3 , 4 , 3 , 2 , 1 , 0 ]] # An empty index returns the entire tensor. i = tf . cast ([], tf . int32 ) tf . gather_nd ( x , i ) . eval () # [[ 1,2,3,4,3,2,1], # [ 2,3,4,3,2,1,0]] # The row 0 of x is [1,2,3,4,3,2,1], so gathering [0] returns it. tf . gather_nd ( x , [ 0 ]) . eval () # [1,2,3,4,3,2,1] # Row 0, column 0 of x is 1, so gathering [0,0] returns 1. tf . gather_nd ( x , [ 0 , 0 ]) . eval () # 1 # The last dimension(or the most deeply-nested list) of the index tensor is an index vector using the previous rules. # So if we stack two copies of the previous index tensors, we'll get two copies of the result: # Two empty indices return two copies of the entire tensor i = tf . cast ([[],[]], tf . int32 ) tf . gather_nd ( x , i ) . eval () # [[[ 1,2,3,4,3,2,1], # [ 2,3,4,3,2,1,0]], # [[ 1,2,3,4,3,2,1], # [ 2,3,4,3,2,1,0]]] # Gathering [0] twice returns the first row twice. tf . gather_nd ( x , [[ 0 ],[ 0 ]]) . eval () # [[1,2,3,4,3,2,1], [ 1 , 2 , 3 , 4 , 3 , 2 , 1 ]] # Gathering [0,0] twice returns row 0, col 0 twice: tf . gather_nd ( x , [[ 0 , 0 ],[ 0 , 0 ]]) . eval () # [1,1]

You should know the rules for all three functions now. As a homework assignment, open a python session and fill in the below puzzle to make the assertion pass:

Handy Tools for working with indices:

import tensorflow as tf sess = tf . InteractiveSession () # x is a random rgb color image. x = tf . random_uniform ([ 32 , 32 , 3 ], maxval = 255 , dtype = tf . int32 ) . eval () # Use argmax to calculate which color has the largest value. Shape = [32, 32] indices = ??? # Use meshgrid and stack to generate coordinates for dimensions except the color, and then add our color indices to the end. Shape = [32, 32, 3] coords = ??? # Select only that largest color using gather_nd to "greyscale" the image. Shape = [32, 32] y = ??? # Write both images to disk so you can compare. tf . write_file ( "original.png" , tf . image . encode_png ( x )) . run () tf . write_file ( "greyscale.png" , tf . image . encode_png ( y )) . run ()

If you get stuck, see the solution below:

import tensorflow as tf sess = tf . InteractiveSession () # x is a random rgb color image. x = tf . random_uniform ([ 32 , 32 , 3 ], maxval = 255 , dtype = tf . int32 ) . eval () # Use argmax to calculate which color has the largest value indices = tf . argmax ( x , axis = 2 ) . eval () # Use meshgrid and stack to generate coordinates for dimensions except the color, and then add our color indices to the end. coords = tf . stack ( tf . meshgrid ( tf . range ( 0 , 32 ), tf . range ( 0 , 32 )) + [ indices ], axis = 2 ) . eval () # Select only that largest color using gather_nd to "greyscale" the image y = tf . gather_nd ( x , coords ) . eval () # Write both images to disk so you can compare. tf . write_file ( "original.png" , tf . image . encode_png ( x )) . run () grey = tf . cast ( tf . reshape ( y , [ 32 , 32 , 1 ]), tf . uint8 ) tf . write_file ( "greyscale.png" , tf . image . encode_png ( grey )) . run ()