Bird
Raised Fist0
NumPydata~20 mins

Array protocol and __array__ in NumPy - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Array Protocol Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this code using __array__?

Consider the following Python class that implements the __array__ method. What will be the output when converting an instance to a NumPy array?

NumPy
import numpy as np

class MyArray:
    def __array__(self):
        return np.array([10, 20, 30])

obj = MyArray()
result = np.array(obj)
print(result)
A[10 20 30]
B[[10 20 30]]
C
[[10]
 [20]
 [30]]
DTypeError: Cannot convert object to array
Attempts:
2 left
💡 Hint

The __array__ method returns a NumPy array representation of the object. NumPy uses this to create the array.

❓ data_output
intermediate
2:00remaining
What is the shape of the array returned by __array__?

Given this class with a __array__ method, what is the shape of the resulting NumPy array?

NumPy
import numpy as np

class Custom:
    def __array__(self):
        return np.array([[1, 2], [3, 4], [5, 6]])

obj = Custom()
arr = np.array(obj)
print(arr.shape)
A(1, 6)
B(2, 3)
C(6,)
D(3, 2)
Attempts:
2 left
💡 Hint

Look at the shape of the array returned inside __array__.

🔧 Debug
advanced
2:00remaining
Why does this code raise an error when using __array__?

Examine the code below. Why does calling np.array(obj) raise an error?

NumPy
import numpy as np

class Broken:
    def __array__(self):
        return [1, 2, 'three']

obj = Broken()
np.array(obj)
ANo error, returns array(['1', '2', 'three'], dtype='<U5')
BTypeError because the list contains mixed types that cannot be converted to a numeric array
CAttributeError because __array__ must return a NumPy array, not a list
DValueError because the list length is inconsistent
Attempts:
2 left
💡 Hint

NumPy can create arrays from lists with mixed types by upcasting to strings.

🧠 Conceptual
advanced
2:00remaining
What is the purpose of the __array__ method in NumPy?

Choose the best description of what the __array__ method does in a Python object used with NumPy.

AIt automatically converts all object attributes to arrays
BIt defines how the object converts itself to a NumPy array when passed to np.array()
CIt is used to check if an object is already a NumPy array
DIt prevents the object from being converted to a NumPy array
Attempts:
2 left
💡 Hint

Think about how NumPy uses this method internally.

🚀 Application
expert
3:00remaining
Using __array__ to customize array conversion behavior

Given the class below, what will be the output of np.array(obj)?

NumPy
import numpy as np

class Wrapper:
    def __init__(self, data):
        self.data = data
    def __array__(self, dtype=None):
        arr = np.array(self.data)
        if dtype:
            return arr.astype(dtype)
        return arr * 2

obj = Wrapper([1, 2, 3])
result = np.array(obj, dtype=np.float64)
print(result)
A[2 4 6]
B[2. 4. 6.]
C[1. 2. 3.]
DTypeError because __array__ does not accept dtype argument
Attempts:
2 left
💡 Hint

The __array__ method can accept a dtype argument to customize conversion.

Practice

(1/5)
1. What is the main purpose of the __array__ method in a custom Python class when working with NumPy?
easy
A. To create a plot from the array data
B. To allow the object to be converted automatically into a NumPy array
C. To perform element-wise multiplication on arrays
D. To define a new data type for NumPy arrays

Solution

  1. Step 1: Understand the role of __array__

    The __array__ method is designed to let custom objects tell NumPy how to convert them into arrays.
  2. Step 2: Identify the main purpose

    This method enables automatic conversion, so NumPy can work with the data efficiently.
  3. Final Answer:

    To allow the object to be converted automatically into a NumPy array -> Option B
  4. Quick Check:

    Conversion to NumPy array [OK]
Hint: Remember: __array__ means 'convert me to array' [OK]
Common Mistakes:
  • Confusing __array__ with data type definition
  • Thinking __array__ performs calculations
  • Assuming __array__ creates plots
2. Which of the following is the correct way to define the __array__ method in a custom class to return a NumPy array?
easy
A. def __array__(self, dtype): return self.data.astype(dtype)
B. def __array__(self): return list(self.data)
C. def __array__(self): return self.data.tolist()
D. def __array__(self, dtype=None): return np.array(self.data, dtype=dtype)

Solution

  1. Step 1: Check method signature

    The __array__ method should accept an optional dtype argument for flexibility.
  2. Step 2: Verify return type

    It must return a NumPy array, so using np.array(self.data, dtype=dtype) is correct.
  3. Final Answer:

    def __array__(self, dtype=None): return np.array(self.data, dtype=dtype) -> Option D
  4. Quick Check:

    Correct signature and return type [OK]
Hint: Include dtype=None and return np.array inside __array__ [OK]
Common Mistakes:
  • Omitting dtype parameter
  • Returning list instead of np.array
  • Using tolist() which returns Python list
3. Given the code below, what will be the output of print(np.array(obj))?
import numpy as np

class MyData:
    def __init__(self):
        self.data = [1, 2, 3]
    def __array__(self, dtype=None):
        return np.array(self.data, dtype=dtype)

obj = MyData()
print(np.array(obj))
medium
A. [1 2 3]
B. [[1 2 3]]
C. TypeError: object cannot be converted to array
D. [1, 2, 3]

Solution

  1. Step 1: Understand __array__ method behavior

    The method returns a NumPy array created from the list [1, 2, 3].
  2. Step 2: Predict np.array conversion

    Calling np.array(obj) triggers obj.__array__(), returning np.array([1, 2, 3]), which prints as [1 2 3].
  3. Final Answer:

    [1 2 3] -> Option A
  4. Quick Check:

    Custom __array__ returns array [1 2 3] [OK]
Hint: np.array calls __array__, returns array, prints without commas [OK]
Common Mistakes:
  • Expecting Python list output with commas
  • Thinking output is nested array
  • Assuming TypeError due to custom class
4. What is wrong with this __array__ method implementation?
def __array__(self):
    return self.data.astype(float)
medium
A. It does not accept the optional dtype argument
B. astype cannot convert to float
C. Returning self.data directly is required
D. The method should return a list, not an array

Solution

  1. Step 1: Check method signature

    The __array__ method should accept an optional dtype argument to allow flexible conversions.
  2. Step 2: Identify missing dtype parameter

    This method lacks the dtype=None parameter, so it cannot handle dtype requests from NumPy.
  3. Final Answer:

    It does not accept the optional dtype argument -> Option A
  4. Quick Check:

    Missing dtype parameter [OK]
Hint: Always include dtype=None in __array__ method [OK]
Common Mistakes:
  • Forgetting dtype argument
  • Thinking astype cannot convert types
  • Returning list instead of array
5. You have a custom class with a __array__ method that returns a NumPy array. You want to ensure that when you call np.array(obj, dtype=np.float64), the returned array respects the requested dtype. How should you modify the __array__ method?
hard
A. def __array__(self, dtype=None): return np.array(self.data)
B. def __array__(self): return np.array(self.data, dtype=np.float64)
C. def __array__(self, dtype=None): return np.array(self.data, dtype=dtype)
D. def __array__(self, dtype): return self.data.astype(dtype)

Solution

  1. Step 1: Understand dtype propagation

    NumPy passes the requested dtype to __array__ as an argument; the method must accept it.
  2. Step 2: Implement dtype-aware conversion

    Return np.array(self.data, dtype=dtype) so the requested dtype is applied correctly.
  3. Final Answer:

    def __array__(self, dtype=None): return np.array(self.data, dtype=dtype) -> Option C
  4. Quick Check:

    Accept dtype and pass to np.array [OK]
Hint: Pass dtype argument to np.array inside __array__ method [OK]
Common Mistakes:
  • Ignoring dtype argument
  • Hardcoding dtype inside method
  • Not accepting dtype parameter
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