Python NumPy For Your Grandma  Section 4.5  Stacking
Course Contents
 Introduction
 NumPy Arrays
2.1 What’s A NumPy Array
2.2 Creating NumPy Arrays
2.3 Indexing And Modifying 1D Arrays
2.4 Indexing And Modifying Multidimensional Arrays
2.5 Basic Math  Intermediate Array Stuff
3.1 Broadcasting
3.2 newaxis
3.3 reshape
3.4 boolean indexing
3.5 nan
3.6 infinity
3.7 random  Common Operations
4.1 where
4.2 Math Funcs
4.3 all and any
4.4 concatenate
4.5 Stacking
4.6 Sorting
4.7 unique  Challenges
This video covers functions for stacking NumPy arrays, such as hstack(), vstack(), and stack().
Code
import numpy as np
foo = np.array(['a', 'b'])
bar = np.array(['c', 'd'])
baz = np.array([['e', 'f']])
bingo = np.array([['g', 'h', 'i']])
bongo = np.array(
[['j', 'k'],
['l', 'm']]
)
# vstack foo and bar
np.vstack((foo, bar))
# vstack foo, bar, and baz
np.vstack((foo, bar, baz))
# vstack baz and bingo
np.vstack((baz, bingo)) # error
# hstack foo and bar
np.hstack((foo, bar))
# hstack baz and bingo
np.hstack((baz, bingo))
# hstack foo and bingo
np.hstack((foo, bingo)) # error
# hstack bingo and bongo
np.hstack((bingo, bongo)) # error
# stack foo and bar along axis 0
np.stack((foo, bar), axis = 0)
# stack foo and bar along axis 1
np.stack((foo, bar), axis = 1)
# stack foo and bar along axis 2
np.stack((foo, bar), axis = 2) # error
# Use the shortcut axis = 1 to insert the new axis behind the last existing axis
np.stack((foo, bar), axis = 1)
Transcript
The functions hstack(), vstack(), and stack() are a lot like the concatenate() function with some subtle differences that can come in handy. vstack is equivalent to concatenation along the first axis after 1D arrays of shape N have been reshaped to 1 by N. hstack is equivalent to concatenation along the second axis, except for 1D arrays where it concatenates along the first axis. And stack is equivalent to concatenation along a newly specified axis.
Let’s start by taking a look at vstack, or vertical stack. The function itself takes just one argument, a sequence of arrays. In pseudocode, you could write the algorithm for vstack as…
 for each array in the sequence:
 if the array is 1d,

then promote array to 2d by giving it a new front axis
 if every array in the sequence has the same shape
 then concatenate the arrays along axis 0
 otherwise throw an error
Let’s see some examples using these four arrays.
We can vstack foo and bar. In this case, they’re both 1d arrays with 2 elements, so they get promoted to 1x2 arrays before getting stacked rowwise into a 2x2 array.
We can also vstack foo, bar and baz. This is like the last example, except baz is already a 1x2 array.
We can’t vstack baz and bingo because, baz has 2 columns and bingo has 3 columns.
Like vstack, the hstack function takes just one argument, a sequence of arrays.
In pseudocode, you could write the algorithm for hstack as…
 if every array in the sequence is 1d
 then concatenate arrays along axis 0
 else, if every array has the same shape excluding axis 1
 then concatenate arrays along axis 1
 otherwise throw an error
So, for hstack, every array in the sequence must have the same dimensionality. You can’t stack a 1d array with a 2d array as you can with vstack.
Let’s see some examples using these five arrays.
We can hstack foo and bar because they’re both 1d arrays. In this case, they’ll be stacked along axis 0 resulting in a new 1d array.
We can also hstack baz and bingo because they’re both 2d arrays with 1 row. hstacking them results in a new 1 by 5 array.
We can’t hstack foo and bingo because they have different dimensionalities. foo is 1d and bingo is 2d. And we can’t hstack bingo and bongo because bingo has 1 row and bongo has 2 rows.
Lastly, let’s have a look at stack(). stack() takes two arguments, a sequence of arrays to combine, and axis, which tells stack to create a new axis along which to combine the arrays.
In pseudocode, you could write the algorithm for stack as…
 if every array is the same shape, and axis is less than or equal to the dimensionality of the arrays,
 then for each array:

insert new axis where specified
 concatenate arrays along the new axis
 otherwise, throw an error
We’ll use two 1d arrays, foo and bar, to make this clear with some examples.
We can stack foo and bar along a new axis 0. Remember the algorithm. foo and bar each get a new axis 0, promoting them to 1x2 arrays, and then they’re stacked along that new axis; so, rowwise, resulting in a new 2 by 2 array.
We can also stack foo and bar along new axis 1. In this case, they each get a new back axis, promoting them to 2x1 arrays, and then they’re stacked column wise, resulting in a new 2 by 2 array.
If we tried to stack them along a new axis 2, we’d get an out of bounds error. Remember, the new axis must be in range of the arrays’ dimensionality.
You can also use the “axis = 1” shortcut to make the new axis the last axis. For foo and bar, it’d be like using axis = 1.