Bird
Raised Fist0
NumPydata~20 mins

Understanding array memory layout in NumPy - Practice Questions & Exercises

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Array Memory Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of array strides in NumPy

What is the output of the following code showing the strides of a 2D NumPy array?

NumPy
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
print(arr.strides)
A(12, 4)
B(3, 1)
C(8, 4)
D(4, 12)
Attempts:
2 left
💡 Hint

Remember that strides show the number of bytes to step in each dimension.

❓ data_output
intermediate
2:00remaining
Effect of transpose on array strides

What is the output of the strides attribute after transposing the array?

NumPy
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
arr_t = arr.T
print(arr_t.strides)
A(4, 12)
B(12, 4)
C(3, 1)
D(8, 4)
Attempts:
2 left
💡 Hint

Transposing swaps the dimensions and their strides.

❓ visualization
advanced
2:30remaining
Visualizing memory layout of a reshaped array

Which option correctly describes the memory layout visualization of the following reshaped array?

NumPy
import numpy as np
arr = np.arange(6, dtype=np.int32)
arr_reshaped = arr.reshape((2, 3))
print(arr_reshaped.strides)
AThe array is stored non-contiguously with gaps between elements.
BThe array is stored with strides (4, 12), columns stored one after another.
CThe array is stored in a contiguous block with strides (12, 4), rows stored one after another.
DThe array is stored in Fortran order with strides (4, 8).
Attempts:
2 left
💡 Hint

Check the strides and how reshape affects memory layout.

🧠 Conceptual
advanced
2:00remaining
Understanding C-contiguous vs F-contiguous arrays

Which statement correctly describes the difference between C-contiguous and F-contiguous arrays in NumPy?

AC-contiguous arrays are always 1D; F-contiguous arrays are always 2D.
BC-contiguous arrays store columns sequentially; F-contiguous arrays store rows sequentially.
CBoth C-contiguous and F-contiguous arrays store data randomly in memory.
DC-contiguous arrays store rows sequentially in memory; F-contiguous arrays store columns sequentially.
Attempts:
2 left
💡 Hint

Think about how multi-dimensional arrays are stored in C and Fortran languages.

🔧 Debug
expert
2:30remaining
Identifying cause of unexpected array memory layout

Given the code below, why does arr.flags['C_CONTIGUOUS'] return False?

NumPy
import numpy as np
arr = np.arange(12).reshape((3,4))
arr_sliced = arr[:, ::2]
print(arr_sliced.flags['C_CONTIGUOUS'])
ABecause the array dtype is not compatible with C-contiguity.
BBecause slicing with a step creates a non-contiguous view in memory.
CBecause the array has only one dimension.
DBecause reshape always returns a non-contiguous array.
Attempts:
2 left
💡 Hint

Consider how slicing with steps affects memory layout.

Practice

(1/5)
1. What does it mean when a NumPy array is C-contiguous?
easy
A. The array is stored as a list of Python objects.
B. The array is stored in column-major order, meaning columns are stored one after another in memory.
C. The array is stored in row-major order, meaning rows are stored one after another in memory.
D. The array is stored in a compressed format to save memory.

Solution

  1. Step 1: Understand memory layout types

    C-contiguous means the array is stored in row-major order, where rows are stored sequentially in memory.
  2. Step 2: Compare with other layouts

    Fortran-contiguous arrays store columns sequentially, not rows.
  3. Final Answer:

    The array is stored in row-major order, meaning rows are stored one after another in memory. -> Option C
  4. Quick Check:

    C-contiguous = row-major order [OK]
Hint: C-contiguous means rows stored sequentially in memory [OK]
Common Mistakes:
  • Confusing C-contiguous with Fortran-contiguous
  • Thinking C-contiguous means compressed storage
  • Assuming C-contiguous means column-major order
2. Which of the following NumPy commands correctly checks if an array a is stored in Fortran-contiguous order?
easy
A. np.isfortran(a)
B. np.iscontiguous(a)
C. a.is_fortran()
D. a.flags.f_contiguous

Solution

  1. Step 1: Recall NumPy flags for memory layout

    NumPy arrays have a flags attribute with f_contiguous to check Fortran order.
  2. Step 2: Identify correct syntax

    a.flags.f_contiguous returns True if array a is Fortran-contiguous.
  3. Final Answer:

    a.flags.f_contiguous -> Option D
  4. Quick Check:

    Check Fortran order with a.flags.f_contiguous [OK]
Hint: Use a.flags.f_contiguous to check Fortran order [OK]
Common Mistakes:
  • Using non-existent functions like np.isfortran
  • Confusing C-contiguous and Fortran-contiguous flags
  • Trying to call methods that don't exist on arrays
3. Consider the following code:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
transposed = arr.T
print(transposed.flags.c_contiguous)

What will be the output?
medium
A. True
B. False
C. Raises an AttributeError
D. None

Solution

  1. Step 1: Understand the original array layout

    Original array arr is C-contiguous by default (row-major).
  2. Step 2: Analyze the transpose operation

    Transposing arr.T changes memory layout to non-C-contiguous because rows and columns swap.
  3. Step 3: Check the flag after transpose

    transposed.flags.c_contiguous will be False since the transpose breaks row-major order.
  4. Final Answer:

    False -> Option B
  5. Quick Check:

    Transpose breaks C-contiguity = False [OK]
Hint: Transpose usually breaks C-contiguity, so flag is False [OK]
Common Mistakes:
  • Assuming transpose keeps C-contiguity True
  • Confusing c_contiguous with f_contiguous
  • Expecting an error instead of a boolean
4. You have this code:
import numpy as np
arr = np.arange(6).reshape(2, 3)
sliced = arr[:, 1:3]
print(sliced.flags.c_contiguous)

Why might sliced.flags.c_contiguous be False?
medium
A. Because slicing can create views that are not stored continuously in memory.
B. Because slicing always returns a copy, which is never contiguous.
C. Because reshape changes the memory layout to Fortran order.
D. Because arange creates arrays that are never contiguous.

Solution

  1. Step 1: Understand slicing behavior

    Slicing often returns a view, which may not be stored continuously in memory.
  2. Step 2: Check memory layout after slicing

    The slice arr[:, 1:3] selects columns 1 and 2, which may not be contiguous in row-major order.
  3. Step 3: Explain why c_contiguous is False

    Because the slice skips some elements in memory, the resulting view is not C-contiguous.
  4. Final Answer:

    Because slicing can create views that are not stored continuously in memory. -> Option A
  5. Quick Check:

    Slicing can break contiguity = False [OK]
Hint: Slicing can create non-contiguous views, so flag may be False [OK]
Common Mistakes:
  • Thinking slicing always returns a copy
  • Assuming reshape changes memory layout to Fortran order by default
  • Believing arange arrays are never contiguous
5. You want to create a large 2D NumPy array with shape (1000, 1000) that is stored in Fortran order for faster column-wise operations. Which code snippet correctly creates such an array?
hard
A. np.zeros((1000, 1000), order='F')
B. np.zeros((1000, 1000), order='C')
C. np.zeros((1000, 1000)).T.copy()
D. np.zeros((1000, 1000), fortran=True)

Solution

  1. Step 1: Recall how to specify memory order in NumPy

    Use the order parameter with value 'F' to create Fortran-contiguous arrays.
  2. Step 2: Analyze each option

    np.zeros((1000, 1000), order='F') uses order='F', which is correct. np.zeros((1000, 1000), order='C') uses 'C' (row-major). np.zeros((1000, 1000)).T.copy() transposes a C-contiguous array and copies it into a new C-contiguous array by default. np.zeros((1000, 1000), fortran=True) uses an invalid parameter.
  3. Final Answer:

    np.zeros((1000, 1000), order='F') -> Option A
  4. Quick Check:

    Use order='F' to create Fortran order arrays [OK]
Hint: Use order='F' in array creation for Fortran order [OK]
Common Mistakes:
  • Using order='C' instead of 'F'
  • Trying to transpose to get Fortran order
  • Using invalid parameters like fortran=True
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard