The numpy - Advanced Indexing docs can explain it better than I could, so take a look at the linked section and in particular into the usage of np.newaxis:
rows = np.array([0, 3], dtype=np.intp)

columns = np.array([0, 2], dtype=np.intp)

rows[:, np.newaxis]
array([[0],
       [3]])

x[rows[:, np.newaxis], columns]
array([[ 0,  2],
       [ 9, 11]])

and the comparison to the indexing approach without broadcasting (previous code snippet).