> Take a sequence of 1-D arrays and stack them as columns to make a single 2-D array. 2-D arrays are stacked as-is, just like with hstack. 1-D arrays are turned into 2-D columns first.
> This is equivalent to concatenation along the first axis after 1-D arrays of shape (N,) have been reshaped to (1,N). Rebuilds arrays divided by vsplit.
>
> This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions concatenate, stack and block provide more general stacking and concatenation operations.
>
> np.row_stack is an alias for vstack. They are the same function.
> This is equivalent to concatenation along the first axis after 1-D arrays of shape (N,) have been reshaped to (1,N). Rebuilds arrays divided by vsplit.
>
> This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions concatenate, stack and block provide more general stacking and concatenation operations.
>
> np.row_stack is an alias for vstack. They are the same function.
> Stack arrays in sequence horizontally (column wise).
>
> This is equivalent to concatenation along the second axis, except for 1-D arrays where it concatenates along the first axis. Rebuilds arrays divided by hsplit.
>
> This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions concatenate, stack and block provide more general stacking and concatenation operations.
> Stack arrays in sequence depth wise (along third axis).
>
> This is equivalent to concatenation along the third axis after 2-D arrays of shape (M,N) have been reshaped to (M,N,1) and 1-D arrays of shape (N,) have been reshaped to (1,N,1). Rebuilds arrays divided by dsplit.
>
> This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions concatenate, stack and block provide more general stacking and concatenation operations.
> Split array into multiple sub-arrays along the 3rd axis (depth).
>
> dsplit is equivalent to split with axis=2, the array is always split along the third axis provided the array dimension is greater than or equal to 3.
> The axis parameter specifies the index of the new axis in the dimensions of the result. For example, if axis=0 it will be the first dimension and if axis=-1 it will be the last dimension.
```python
import numpy as np
a = np.zeros((6, 8, 10))
print(a.shape) # -> (6, 8, 10)
b = np.stack((a, a), axis=0)
print(b.shape) # -> (2, 6, 8, 10)
b = np.stack((a, a), axis=1)
print(b.shape) # -> (6, 2, 8, 10)
b = np.stack((a, a), axis=2)
print(b.shape) # -> (6, 8, 2, 10)
b = np.stack((a, a), axis=3)
print(b.shape) # -> (6, 8, 10, 2)
b = np.stack((a, a), axis=4) # AxisError: axis 4 is out of bounds for array of dimension 4
## [numpy.split](https://numpy.org/doc/stable/reference/generated/numpy.split.html) and [numpy.array_split](https://numpy.org/doc/stable/reference/generated/numpy.array_split.html)
```python
numpy.split(ary, indices_or_sections, axis=0)
```
> Split an array into multiple sub-arrays as **views** into ary.
```python
import numpy as np
a = np.arange(0, 20).reshape(10, 2)
print(a)
print(a.shape) # -> (10, 2)
print()
b = np.split(a, 2, axis=0)
print(len(b)) # -> 2
print(b[0])
print(b[0].shape) # -> (5, 2)
print()
print(b[1])
print(b[1].shape) # -> (5, 2)
b = np.split(a, 3, axis=0) # ValueError: array split does not result in an equal division
> The only difference between these functions is that array_split allows indices_or_sections to be an integer that does not equally divide the axis. For an array of length l that should be split into n sections, it returns l % n sub-arrays of size l//n + 1 and the rest of size l//n.
> Return selected slices of an array along given axis.
>
> When working along a given axis, a slice along that axis is returned in output for each index where condition evaluates to True. When working on a 1-D array, compress is equivalent to extract.
```python
import numpy as np
a = np.arange(0, 20).reshape(5, 4)
print(a)
print(a.shape) # -> (5, 4)
print()
b = np.compress([True, False, False, True, True], a, axis=0)
print(b)
print(b.shape) # -> (3, 4)
print()
b = np.compress([False, True, False, True], a, axis=1)