It's easier to understand what np.vstack, np.hstack and np.dstack* do by looking at the .shape attribute of the output array.

Using your two example arrays:

print(a.shape, b.shape)
# (3, 2) (3, 2)
  • np.vstack concatenates along the first dimension...

    print(np.vstack((a, b)).shape)
    # (6, 2)
    
  • np.hstack concatenates along the second dimension...

    print(np.hstack((a, b)).shape)
    # (3, 4)
    
  • and np.dstack concatenates along the third dimension.

    print(np.dstack((a, b)).shape)
    # (3, 2, 2)
    

Since a and b are both two dimensional, np.dstack expands them by inserting a third dimension of size 1. This is equivalent to indexing them in the third dimension with np.newaxis (or alternatively, None) like this:

print(a[:, :, np.newaxis].shape)
# (3, 2, 1)

If c = np.dstack((a, b)), then c[:, :, 0] == a and c[:, :, 1] == b.

You could do the same operation more explicitly using np.concatenate like this:

print(np.concatenate((a[..., None], b[..., None]), axis=2).shape)
# (3, 2, 2)

* Importing the entire contents of a module into your global namespace using import * is considered bad practice for several reasons. The idiomatic way is to import numpy as np.

Answer from ali_m on Stack Overflow
🌐
NumPy
numpy.org › doc › 2.2 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v2.2 Manual
numpy.dstack(tup)[source]# 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).
numpy.ravel
Return a contiguous flattened array · A 1-D array, containing the elements of the input, is returned. A copy is made only if needed
numpy.squeeze
Remove axes of length one from a · Selects a subset of the entries of length one in the shape. If an axis is selected with shape entry greater than one, an error is raised
numpy.asarray
Convert the input to an array · Input data, in any form that can be converted to an array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays
numpy.transpose
Returns an array with axes transposed · For a 1-D array, this returns an unchanged view of the original array, as a transposed vector is simply the same vector. To convert a 1-D array into a 2-D column vector, an additional dimension must be added, e.g., np.atleast_2d(a).T achieves this, as ...
🌐
NumPy
numpy.org › doc › stable › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v2.5 Manual
numpy.dstack(tup)[source]# 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).
🌐
w3resource
w3resource.com › numpy › manipulation › dstack.php
NumPy: numpy.dstack() function - w3resource
NumPy Array manipulation: numpy.dstack() function, example - The numpy.dstack() is used to stack arrays in sequence depth wise (along third axis).
Top answer
1 of 4
91

It's easier to understand what np.vstack, np.hstack and np.dstack* do by looking at the .shape attribute of the output array.

Using your two example arrays:

print(a.shape, b.shape)
# (3, 2) (3, 2)
  • np.vstack concatenates along the first dimension...

    print(np.vstack((a, b)).shape)
    # (6, 2)
    
  • np.hstack concatenates along the second dimension...

    print(np.hstack((a, b)).shape)
    # (3, 4)
    
  • and np.dstack concatenates along the third dimension.

    print(np.dstack((a, b)).shape)
    # (3, 2, 2)
    

Since a and b are both two dimensional, np.dstack expands them by inserting a third dimension of size 1. This is equivalent to indexing them in the third dimension with np.newaxis (or alternatively, None) like this:

print(a[:, :, np.newaxis].shape)
# (3, 2, 1)

If c = np.dstack((a, b)), then c[:, :, 0] == a and c[:, :, 1] == b.

You could do the same operation more explicitly using np.concatenate like this:

print(np.concatenate((a[..., None], b[..., None]), axis=2).shape)
# (3, 2, 2)

* Importing the entire contents of a module into your global namespace using import * is considered bad practice for several reasons. The idiomatic way is to import numpy as np.

2 of 4
6

Let x == dstack([a, b]). Then x[:, :, 0] is identical to a, and x[:, :, 1] is identical to b. In general, when dstacking 2D arrays, dstack produces an output such that output[:, :, n] is identical to the nth input array.

If we stack 3D arrays rather than 2D:

x = numpy.zeros([2, 2, 3])
y = numpy.ones([2, 2, 4])
z = numpy.dstack([x, y])

then z[:, :, :3] would be identical to x, and z[:, :, 3:7] would be identical to y.

As you can see, we have to take slices along the third axis to recover the inputs to dstack. That's why dstack behaves the way it does.

🌐
NumPy
numpy.org › doc › 2.1 › reference › generated › numpy.ma.dstack.html
numpy.ma.dstack — NumPy v2.1 Manual
ma.dstack = <numpy.ma.extras._fromnxfunction_seq object># 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).
🌐
GeeksforGeeks
geeksforgeeks.org › python › python-numpy-dstack-method
Numpy dstack() method-Python - GeeksforGeeks
June 12, 2025 - numpy.dstack() stacks arrays depth-wise along the third axis (axis=2). For 1D arrays, it promotes them to (1, N, 1) before stacking.
🌐
NumPy
numpy.org › doc › 2.4 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v2.4 Manual
numpy.dstack(tup)[source]# 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).
Find elsewhere
🌐
NumPy
numpy.org › devdocs › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v2.6.dev0 Manual
numpy.dstack(tup)[source]# 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).
🌐
Programiz
programiz.com › python-programming › numpy › methods › dstack
NumPy dstack()
The dstack() method stacks the sequence of input arrays depthwise. import numpy as np array1 = np.array([[0, 1], [2, 3]]) array2 = np.array([[4, 5], [6, 7]])
🌐
NumPy
numpy.org › doc › 2.3 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v2.3 Manual
numpy.dstack(tup)[source]# 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).
🌐
NumPy
numpy.org › doc › 1.13 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v1.13 Manual
June 10, 2017 - numpy.dstack(tup)[source]¶ · Stack arrays in sequence depth wise (along third axis). Takes a sequence of arrays and stack them along the third axis to make a single array. Rebuilds arrays divided by dsplit. This is a simple way to stack 2D arrays (images) into a single 3D array for processing.
🌐
Medium
medium.com › @andiksyldnata › understanding-numpy-dstack-in-python-eb40e4467c09
Understanding NumPy dstack in Python | by 99spaceidea | Medium
June 21, 2023 - The dstack() function takes a sequence of arrays as input and returns a single array that is stacked along the third axis. The arrays in the sequence must have the same shape along all but the third axis.
🌐
NumPy
numpy.org › doc › 1.15 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v1.15 Manual
November 4, 2018 - numpy.dstack(tup)[source]¶ · 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).
🌐
NumPy
numpy.org › doc › 2.1 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v2.1 Manual
numpy.dstack(tup)[source]# 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).
🌐
NumPy
numpy.org › doc › 2.2 › reference › generated › numpy.ma.dstack.html
numpy.ma.dstack — NumPy v2.2 Manual
ma.dstack = <numpy.ma.extras._fromnxfunction_seq object># 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).
🌐
NumPy
numpy.org › doc › 1.22 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v1.22 Manual
numpy.dstack(tup)[source]¶ · 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).
🌐
NumPy
numpy.org › doc › 2.3 › reference › generated › numpy.ma.dstack.html
numpy.ma.dstack — NumPy v2.3 Manual
ma.dstack = <numpy.ma.extras._fromnxfunction_seq object># 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).
🌐
SciPy
docs.scipy.org › doc › › numpy-1.9.2 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v1.9 Manual
numpy.dstack(tup)[source]¶ · Stack arrays in sequence depth wise (along third axis). Takes a sequence of arrays and stack them along the third axis to make a single array. Rebuilds arrays divided by dsplit. This is a simple way to stack 2D arrays (images) into a single 3D array for processing.
🌐
SciPy
docs.scipy.org › doc › numpy-1.12.0 › reference › generated › numpy.dstack.html
numpy.dstack — NumPy v1.12 Manual
January 16, 2017 - numpy.dstack(tup)[source]¶ · Stack arrays in sequence depth wise (along third axis). Takes a sequence of arrays and stack them along the third axis to make a single array. Rebuilds arrays divided by dsplit. This is a simple way to stack 2D arrays (images) into a single 3D array for processing.