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()