Understanding the Shuffle and Split Process in a Neural Network Code
Nope, the last 10 elements are definitely the labels. np.column_stack appends the elements of the second array to the corresponding row of the first array. 

A quick example (Python 3.5), random one-hot encoding snippet was copied from this answer on SO

&gt;&gt;&gt; import numpy as np
&gt;&gt;&gt; np.__version__
'1.15.0'
&gt;&gt;&gt; rand_enc = np.random.randint(0,3,size=(10))
&gt;&gt;&gt; labels = np.zeros((10,3))
&gt;&gt;&gt; labels[np.arange(10), rand_enc] = 1
&gt;&gt;&gt; labels
array([[0., 0., 1.],
       [0., 1., 0.],
       [1., 0., 0.],
       [1., 0., 0.],
       [1., 0., 0.],
       [1., 0., 0.],
       [0., 0., 1.],
       [0., 0., 1.],
       [0., 1., 0.],
       [1., 0., 0.]])
&gt;&gt;&gt; features = np.random.rand(10,4)
&gt;&gt;&gt; features
array([[0.51599703, 0.24758895, 0.70951355, 0.52074341],
       [0.64851074, 0.14481191, 0.88837244, 0.86901571],
       [0.36303914, 0.93464881, 0.21238598, 0.24998789],
       [0.74290604, 0.96704141, 0.16971294, 0.99628383],
       [0.20225753, 0.78450864, 0.42730556, 0.84727098],
       [0.95372573, 0.38092036, 0.73628447, 0.22120431],
       [0.10821134, 0.54467407, 0.00452555, 0.15295404],
       [0.7353348 , 0.26629375, 0.96241551, 0.84573258],
       [0.80659848, 0.34873381, 0.12219345, 0.46671669],
       [0.07837654, 0.82128673, 0.79523531, 0.10652154]])
&gt;&gt;&gt; np.column_stack((features, labels))
array([[0.51599703, 0.24758895, 0.70951355, 0.52074341, 0.        ,
        0.        , 1.        ],
       [0.64851074, 0.14481191, 0.88837244, 0.86901571, 0.        ,
        1.        , 0.        ],
       [0.36303914, 0.93464881, 0.21238598, 0.24998789, 1.        ,
        0.        , 0.        ],
       [0.74290604, 0.96704141, 0.16971294, 0.99628383, 1.        ,
        0.        , 0.        ],
       [0.20225753, 0.78450864, 0.42730556, 0.84727098, 1.        ,
        0.        , 0.        ],
       [0.95372573, 0.38092036, 0.73628447, 0.22120431, 1.        ,
        0.        , 0.        ],
       [0.10821134, 0.54467407, 0.00452555, 0.15295404, 0.        ,
        0.        , 1.        ],
       [0.7353348 , 0.26629375, 0.96241551, 0.84573258, 0.        ,
        0.        , 1.        ],
       [0.80659848, 0.34873381, 0.12219345, 0.46671669, 0.        ,
        1.        , 0.        ],
       [0.07837654, 0.82128673, 0.79523531, 0.10652154, 1.        ,
        0.        , 0.        ]])


As you can see, the labels get appended at the end! The shuffling code only manipulates the rows, so the column ordering is preserved. You do need to pass np.column_stack a tuple of your NumPy arrays, but otherwise this gets the job done.

Hope that clears things up!

Edit: I don't know how the instructor got a size mismatch between the train_input and train_labels, from what I understand from the code you shared they should be (800,25000) and (800,10)