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]]
๐ŸŒ
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 ยป
Discussions

python - Accessing slice of 3D numpy array - Stack Overflow
I have a 3D numpy array of floating point numbers. Am I indexing the array improperly? I'd like to access slice 124 (index 123) but am seeing this error: >>> arr.shape (31, 285, 286) >... More on stackoverflow.com
๐ŸŒ stackoverflow.com
python - How does slicing in three dimensional numpy array work? - Stack Overflow
I know that elements 3, 6, 9 and ... array or more. How does it work? ... Hi Sandeep, it would be worth the time to go through this official documentation on advance indexing. That should give you clarity on why your outputs look like they do. ... Short answer: after indexing numpy automaticaly ... More on stackoverflow.com
๐ŸŒ stackoverflow.com
python - Slice a 3D numpy array by a list of indices - Stack Overflow
I can't seeem to figure out how to slice an array so that I get the indices of interest in the 3rd dimension. Here is an example 3D numpy array. data = np.arange(60).reshape(5,4,3) print data ... More on stackoverflow.com
๐ŸŒ stackoverflow.com
February 14, 2017
Numpy slicing behaving weirdly when slicing three dimensional array. Any explanation?
Because you are not using slicing. To get what you want, do x2 = x[:, 1:3, 1:3]. Multidimensional indexing with integer sequences (rather than with slices) works a little different, in that it doesn't independently select elements from all dimensions. Instead, it takes integers at matching positions from all index sequences to define a single element to put into the result. So x[:, [1, 2], [1, 2]] consists of x[:, 1, 1] and x[:, 2, 2]. To get the same output as with the above slices, you'd have to do x[:, [[1, 1], [2, 2]], [[1, 2], [1, 2]]]. More on reddit.com
๐ŸŒ r/learnpython
6
3
April 27, 2022
๐ŸŒ
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.
๐ŸŒ
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.
๐ŸŒ
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], ...
๐ŸŒ
Python Guides
pythonguides.com โ€บ python-numpy-3d-array
3D Arrays In Python Using NumPy
May 16, 2025 - import numpy as np # Create a sample 3D array array_3d = np.arange(24).reshape(2, 3, 4) print("Original 3D array:") print(array_3d) # Get a specific 2D array (the first one) first_matrix = array_3d[0] print("\nFirst 2D matrix:") print(first_matrix) # Get a specific row from a specific 2D array second_matrix_first_row = array_3d[1, 0] print("\nFirst row of second matrix:") print(second_matrix_first_row) # Get a specific element specific_element = array_3d[1, 2, 3] print(f"\nElement at [1,2,3]: {specific_element}") # Slice across all dimensions subset = array_3d[0:2, 1:3, 1:3] print("\nSubset sl
Find elsewhere
๐ŸŒ
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.
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.

๐ŸŒ
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.
๐ŸŒ
GeeksforGeeks
geeksforgeeks.org โ€บ python-slicing-multi-dimensional-arrays
Python slicing multi-dimensional arrays - GeeksforGeeks
July 9, 2024 - In this example, we first create a 3-D NumPy array called array_3d. Then, we use negative indexing to slice the last row from each 2-D matrix within the 3-D array.
๐ŸŒ
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.
๐ŸŒ
TutorialsPoint
tutorialspoint.com โ€บ numpy โ€บ numpy_slicing.htm
NumPy - Slicing
Let us create a 3D array using the arange() function and reshape it with values containing 0 to 23 then reshape this 1D into 3D 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 = np.arange(24).reshape(2, 3, 4) print("Original 3D array: \n" , arr_3d) subarray = arr_3d[0, :, :2] print("\nSliced subarray:", subarray)
๐ŸŒ
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!

๐ŸŒ
NumPy
numpy.org โ€บ devdocs โ€บ user โ€บ basics.indexing.html
Indexing on ndarrays โ€” NumPy v2.6.dev0 Manual
The standard rules of sequence slicing apply to basic slicing on a per-dimension basis (including using a step index). Some useful concepts to remember include: The basic slice syntax is i:j:k where i is the starting index, j is the stopping index, and k is the step (\(k\neq0\)).
๐ŸŒ
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.
๐ŸŒ
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: