NumPy arrays iterate over the left-most axis first. Thus if B has shape (2,3,4), then B[0] has shape (3,4) and B[1] has shape (3,4). In this sense, you could think of B as 2 arrays of shape (3,4). You can sort of see the two arrays in the repr of B:

In [233]: B = np.arange(2*3*4).reshape((2,3,4))
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],       <-- first (3,4) array 
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],      <-- second (3,4) array 
        [20, 21, 22, 23]]])

You can also think of B as containing four 2x3 arrays by iterating over the last index first:

for i in range(4):
    print(B[:,:,i])

# [[ 0  4  8]
#  [12 16 20]]
# [[ 1  5  9]
#  [13 17 21]]
# [[ 2  6 10]
#  [14 18 22]]
# [[ 3  7 11]
#  [15 19 23]]

but you could just as easily think of B as three 2x4 arrays:

for i in range(3):
    print(B[:,i,:])

# [[ 0  1  2  3]
#  [12 13 14 15]]
# [[ 4  5  6  7]
#  [16 17 18 19]]
# [[ 8  9 10 11]
#  [20 21 22 23]]

NumPy arrays are completely flexible this way. But as far as the repr of B is concerned, what you see corresponds to two (3x4) arrays since B iterates over the left-most axis first.

for arr in B:
    print(arr)

# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
# [[12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]
Answer from unutbu on Stack Overflow
Top answer
1 of 3
28

NumPy arrays iterate over the left-most axis first. Thus if B has shape (2,3,4), then B[0] has shape (3,4) and B[1] has shape (3,4). In this sense, you could think of B as 2 arrays of shape (3,4). You can sort of see the two arrays in the repr of B:

In [233]: B = np.arange(2*3*4).reshape((2,3,4))
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],       <-- first (3,4) array 
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],      <-- second (3,4) array 
        [20, 21, 22, 23]]])

You can also think of B as containing four 2x3 arrays by iterating over the last index first:

for i in range(4):
    print(B[:,:,i])

# [[ 0  4  8]
#  [12 16 20]]
# [[ 1  5  9]
#  [13 17 21]]
# [[ 2  6 10]
#  [14 18 22]]
# [[ 3  7 11]
#  [15 19 23]]

but you could just as easily think of B as three 2x4 arrays:

for i in range(3):
    print(B[:,i,:])

# [[ 0  1  2  3]
#  [12 13 14 15]]
# [[ 4  5  6  7]
#  [16 17 18 19]]
# [[ 8  9 10 11]
#  [20 21 22 23]]

NumPy arrays are completely flexible this way. But as far as the repr of B is concerned, what you see corresponds to two (3x4) arrays since B iterates over the left-most axis first.

for arr in B:
    print(arr)

# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
# [[12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]
2 of 3
9

I hope the below example would clarify the second part of your question where you have asked about getting a 2X3 matrics when you type print(B[:,:,1])

import numpy as np
B = [[[1,2,3,4],
  [5,6,7,8],
  [9,10,11,12]],

 [[13,14,15,16],
  [17,18,19,20],
  [21,22,23,24]]]

B = np.array(B)
print(B)
print()
print(B[:,:,1])

[[[ 1  2  3  4]
  [ 5  6  7  8]
  [ 9 10 11 12]]

 [[13 14 15 16]
  [17 18 19 20]
  [21 22 23 24]]]

[[ 2  6 10]
 [14 18 22]]

Since the dimension of B is 2X3X4, It means you have two matrices of size 3X4 as far as repr of B is concerned

Now in B[:,:,1] we are passing : , : and 1. First : indicates that we are selecting both the 3X4 matrices. The second : indicates that we are selecting all the rows from both the 3X4 matrices. The third parameter 1 indicates that we are selecting only the second column values of all the rows from both the 3X4 matrices. Hence we get

[[ 2  6 10]
 [14 18 22]]
🌐
GeeksforGeeks
geeksforgeeks.org › python › python-slicing-multi-dimensional-arrays
Python Slicing Multi-Dimensional Arrays - GeeksforGeeks
July 1, 2026 - Rows and columns are the basic components of a multi-dimensional array. NumPy allows to extract them easily using slicing, making it simple to access specific parts of the data.
🌐
W3Schools
w3schools.com › python › numpy › numpy_array_slicing.asp
NumPy Array Slicing
Slice elements from the beginning to index 4 (not included): import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7]) print(arr[:4]) Try it Yourself »
🌐
Reddit
reddit.com › r/learnpython › numpy slicing behaving weirdly when slicing three dimensional array. any explanation?
r/learnpython on Reddit: Numpy slicing behaving weirdly when slicing three dimensional array. Any explanation?
April 27, 2022 -

Hi, guys!

I have a three dimensional array x=np.random.randn(10, 5, 5)

When I use: x2 = x[:, [1, 2], [1, 2]] I should get an array of size [10, 2, 2] but I don't. Instead I get an array of shape [10, 2].

To get what I want, I have to use two lines of code: x2 = x[:, [1, 2], :]; x2=x2[:, :, [1, 2]].

I don't understand why is numpy behaving in this manner. Any explanation is much appreciated

Thank you!

🌐
Regenerativetoday
regenerativetoday.com › indexing-and-slicing-of-1d-2d-and-3d-arrays-using-numpy
Indexing and Slicing of 1D, 2D and 3D Arrays Using Numpy – Regenerative
In this case, 2 is the starting point and 3 is the interval. So the returning array stars from the element in index two. After that it takes every third element of the array till the end. Say, we don’t need till the end. We only want to output till -4. In that case we can further slice it.
🌐
Pythoninformer
pythoninformer.com › python-libraries › numpy › index-and-slice
PythonInformer - Indexing and slicing numpy arrays
February 4, 2018 - However, for trailing indices, simply omitting the index counts as a full slice. So for 2D arrays: a2[1:3,:] # is the same as a2[1:3] For 3D arrays: a3[1:,:2,:] # is the same as a3[1:,:2] a3[1:,:,:] # is the same as a3[1:,:] # and is also the same as a3[1:] As we saw earlier, you can use an index to select a particular plane column or row. Here we select row 1, columns 2:4: import numpy as np a2 = np.array([[10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29]]) print(a2[1,2:4]) # [17 18] You can also use a slice of length 1 to do something similar (slice 1:2 instead of index 1): print(a2[1:2,2:4]) # [[17 18]] Notice the subtle difference.
🌐
Medium
medium.com › @whyamit101 › understanding-numpy-slicing-with-examples-57351d21387c
Understanding NumPy Slicing with Examples | by why amit | Medium
February 9, 2025 - Here’s where things get even more interesting. With 2D and 3D arrays, slicing lets you extract specific rows, columns, or even submatrices.
Find elsewhere
🌐
CodeChef
codechef.com › learn › course › numpy › LNP05 › problems › LNPPR27
Indexing and slicing 3D arrays in NumPy - Practice Problems and Challenges
Test your Learn NumPy - Practice Problems and Challenges knowledge with our Indexing and slicing 3D arrays practice problem. Dive into the world of numpy challenges at CodeChef.
Top answer
1 of 5
1
arr = np.array([[[1,2,3], [4,5,6]], [[7,8,9],[10,11,12]]])

# array([[[ 1,  2,  3],
#         [ 4,  5,  6]],

#        [[ 7,  8,  9],
#         [10, 11, 12]]])

arr.shape # ------> (2,2,3)
# Think of them as axis
# lets create the first 2 axis of (`2`, ...)

#         |(1)
#         |
#         |
#         |         
#         |---------(0)


# now lets create second 2 axis of (2, `2`, ..)

#            (1,1)
#         |
#         |---(1,0)
#         |
#         |
#         |
#         |         |(0,1)
#         |---------|---(0,0)

# now lets create the last 3 axis of (2, 2, `3`)

#           /``(1,1,0) = 10
#          |-- (1,1,1) = 11
#         | \__(1,1,2) = 12
#         |
#         |  /``(1,0,0) = 7
#         |--|--(1,0,1) = 8
#         |  \__(1,0,2) = 9
#         |
#         |
#         |         /``(0,1,0) = 4
#         |         |--(0,1,1) = 5
#         |         \__(0,1,2) = 6
#         |         |
#         |         |
#         |---------|---/``(0,0,0) = 1
#                       |--(0,0,1) = 2
#                       \__(0,0,2) = 3

# now suppose you ask
arr[0, :, :] # give me the first axis alon with all it's component

#         |
#         |         /``(0,1,0) = 4
#         |         |--(0,1,1) = 5
#         |         \__(0,1,2) = 6
#         |         |
#         |         |
#         |---------|---/``(0,0,0) = 1
#                       |--(0,0,1) = 2
#                       \__(0,0,2) = 3

# So it will print 

# array([[1, 2, 3],
#        [4, 5, 6]])

arr[:, 0, :] # you ask take all the first axis 1ut give me only the first axis of the first axis and all its components

#           
#         
#         
#         
#         |  /``(1,0,0) = 7
#         |--|--(1,0,1) = 8
#         |  \__(1,0,2) = 9
#         |
#         |
#         |         
#         |         
#         |         
#         |         
#         |         
#         |---------|---/``(0,0,0) = 1
#                       |--(0,0,1) = 2
#                       \__(0,0,2) = 3

# so you get the output

# array([[1, 2, 3],
#        [7, 8, 9]])

# like wise you ask
print(arr[0:2, : , 2])
# so you are saying give (0,1) first axis, all of its children and only 3rd (index starts at 0 so 2 means 3) children
# 0:2 means 0 to 2 `excluding` 2; 0:5 means 0,1,2,3,4

#           
#          |
#         | \__(1,1,2) = 12
#         |
#         |  
#         |--
#         |  \__(1,0,2) = 9
#         |
#         |
#         |        
#         |         
#         |         \__(0,1,2) = 6
#         |         |
#         |         |
#         |---------|---/
#                       |
#                       \__(0,0,2) = 3

# so you get

# array([[ 3,  6],
#        [ 9, 12]])
2 of 5
1

Going In

Given the array:

    arr = np.array([[[1,2,3], [4,5,6]], [[7,8,9],[10,11,12]]])

The shape of arr, given by arr.shape is (2,2,3).

That basically means that if we start from outside (and ignore the first square bracket), we have 2 arrays in that scope. If we enter to one of those we can count 2 arrays and if we enter either we find 3 elements. I think having this view is quite helpful in understanding the following.

Specifying arr[1,1,2] selects the second array(index 1) in the outermost scope, and then selects the second array in the following scope and then selects the third element. The output is a single number:

    12

specifying arr[:,1,2] first simultaneously selects all arrays at the outermost scope and then for each of these selects the second array (index 1). When we then enter into the next scope, we pick out the 3rd elements. This outputs two numbers:

    array([ 6, 12])

specifying arr[:, : , 2] outputs 4 numbers since 1. at the first scope we selected all arrays (2) 2. at the next scope we selected all array (2 for each in the first)

    array([[ 3,  6],
           [ 9, 12]])

Coming out

Instinctually, the reason why they appear as 2x2 array can be viewed as receding from the lowermost scope. Elements are getting enclosed in square brackets because that share a scope. 3 and 6 will be in one array while 9 and 12 will be in another array.

🌐
YouTube
youtube.com › shorts › IOhAYi0kgz0
Indexing and slicing 3D array using numpy in python - YouTube
This video demonstrates slicing and indexing of a 3D array using bumpy library in python
Published: October 23, 2023
🌐
YouTube
youtube.com › watch
Indexing and Slicing of 1D, 2D and 3D Arrays Using Numpy - YouTube
This video starts with basic indexing and shows some more advanced techniques of indexing and slicing. I made a blog post explaining array indexing and slici...
Published: April 10, 2020
🌐
MachineLearningMastery
machinelearningmastery.com › home › blog › how to index, slice and reshape numpy arrays for machine learning
How to Index, Slice and Reshape NumPy Arrays for Machine Learning - MachineLearningMastery.com
June 13, 2020 - Running the example first prints the size of each dimension in the 2D array, reshapes the array, then summarizes the shape of the new 3D array. This section provides more resources on the topic if you are looking go deeper. ... In this tutorial, you discovered how to access and reshape data in NumPy arrays with Python.
🌐
Python Like You Mean It
pythonlikeyoumeanit.com › Module3_IntroducingNumpy › AccessingDataAlongMultipleDimensions.html
Accessing Data Along Multiple Dimensions in an Array — Python Like You Mean It
Keeping track of the meaning of an array’s various dimensions can quickly become unwieldy when working with real datasets. xarray is a Python library that provides functionality comparable to NumPy, but allows users provide explicit labels for an array’s dimensions; that is, you can name each dimension. Using an xarray to select Brad’s scores could look like grades.sel(student='Brad'), for instance. This is a valuable library to look into at your leisure. Let’s build up some intuition for arrays with a dimensionality higher than 2. The following code creates a 3-dimensional array: # a 3D array, shape-(2, 2, 2) >>> d3_array = np.array([[[0, 1], ...
🌐
YouTube
youtube.com › watch
Python Data Science Tutorial: Numpy #5 Slicing of 1D, 2D, 3D and 4D Arrays - YouTube
In this Python tutorial of Numpy we are using slicing. Slicing of 1D, 2D, 3D and 4D Arrays will occur and i hope i can understandably explain how to slice. S...
Published: October 12, 2023
🌐
Reddit
reddit.com › r/learnpython › question about slicing 3d numpy arrays.
r/learnpython on Reddit: Question about slicing 3d numpy arrays.
January 18, 2015 -

Consider the following:

A = np.zeros((2,3))
print(A)

[[ 0.  0.  0.]
 [ 0.  0.  0.]]

This make sense to me. I'm telling numpy to make a 2x3 matrix, and that's what I get.

However, the following:

B = np.zeros((2, 3, 4))
print(B)

Gives me this:

[[[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]

 [[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]]

This doesn't make sense to me. Aren't I telling numpy to make a cube which has 4 2x3 matrices? I'm even more confused because although the data structure looks incorrect, the slicing works exactly as planned:

print(B[:,:,1])

[[ 0.  0.  0.]
 [ 0.  0.  0.]]

I'm missing something about how these arrays are constructed, but I'm not sure what. Can someone explain what I'm missing or not understanding?

Thanks so much!

🌐
Towards Data Science
towardsdatascience.com › home › data science › working with numpy arrays: slicing
Working with Numpy Arrays: Slicing | Towards Data Science
June 25, 2020 - However, when we have trailing indices, we can still obtain a full slice by simply omitting the index. Simply this means that... ... # 3D Arraysprint(a_3d[1:, :2, :] == a_3d[1:, :2])print(a_3d[2:, :, :] == a_3d[2:, :])>>>> [[ True True True True True] [ True True True True True]] [[[ True True True] [ True True True]] [[ True True True] [ True True True]]]pr
🌐
Pythonhealthdatascience
pythonhealthdatascience.com › content › 01_algorithms › 03_numpy › 03_slicing.html
Array slicing and indexing — Python for health data science.
We start with td[:, 1, 0] that we know gives us [13, 12, 33]. We selected all rows by setting i=:. Imagine for a moment that td is actually only a 1D array. What would you do to slice an array to get the first two elements only? You would use td[:2]. Therefore our 3D equivalent is:
🌐
Medium
medium.com › data-science › slicing-numpy-arrays-like-a-ninja-e4910670ceb0
Slice numpy arrays in python like a ninja | TDS Archive
November 12, 2021 - Tutorial on slicing numpy arrays in python with positive and negative index ranges for 1D, 2D, 3D and more dimensional numpy arrays.
🌐
TutorialsPoint
tutorialspoint.com › numpy › numpy_slicing.htm
NumPy - Slicing
Let us create a 3D array using ... representing a (2*3*4) matrix and use slice object for slicing to get a subarray which selects the first layer (depth), all rows, and the first 2 columns − · import numpy as np arr_3d = ...