Bird
Raised Fist0
NumPydata~7 mins

Structured arrays vs DataFrames in NumPy

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Structured arrays and DataFrames help organize data with different types in one place. They make it easy to work with complex data like tables.

You have data with multiple columns of different types, like names and ages.
You want to do fast numerical operations on data with fixed types.
You need to store and access data like a table but want to use numpy functions.
You want to use pandas features like easy filtering and grouping.
You want to convert between numpy arrays and pandas DataFrames.
Syntax
NumPy
import numpy as np
import pandas as pd

# Structured array creation
structured_array = np.array([(1, 'Alice', 25), (2, 'Bob', 30)],
                            dtype=[('id', 'i4'), ('name', 'U10'), ('age', 'i4')])

# DataFrame creation
data_frame = pd.DataFrame({'id': [1, 2], 'name': ['Alice', 'Bob'], 'age': [25, 30]})

Structured arrays use numpy's dtype to define column names and types.

DataFrames are from pandas and offer more features for data analysis.

Examples
This shows an empty structured array with defined columns but no rows.
NumPy
import numpy as np

# Empty structured array
empty_structured = np.array([], dtype=[('id', 'i4'), ('name', 'U10'), ('age', 'i4')])
print(empty_structured)
Structured array with a single row of data.
NumPy
import numpy as np

# Structured array with one element
one_element = np.array([(1, 'Alice', 25)], dtype=[('id', 'i4'), ('name', 'U10'), ('age', 'i4')])
print(one_element)
DataFrame with one row, easy to read and manipulate.
NumPy
import pandas as pd

# DataFrame with one row
one_row_df = pd.DataFrame({'id': [1], 'name': ['Alice'], 'age': [25]})
print(one_row_df)
Empty DataFrame with column names but no data rows.
NumPy
import pandas as pd

# DataFrame with empty data
empty_df = pd.DataFrame(columns=['id', 'name', 'age'])
print(empty_df)
Sample Program

This program shows how to create a structured array, access its data, convert it to a DataFrame, and filter rows in the DataFrame.

NumPy
import numpy as np
import pandas as pd

# Create a structured array with 3 rows
structured_array = np.array([
    (1, 'Alice', 25),
    (2, 'Bob', 30),
    (3, 'Charlie', 35)
], dtype=[('id', 'i4'), ('name', 'U10'), ('age', 'i4')])

print('Structured Array:')
print(structured_array)
print()

# Access the 'name' column from structured array
print('Names from structured array:')
print(structured_array['name'])
print()

# Convert structured array to pandas DataFrame
data_frame = pd.DataFrame(structured_array)
print('Converted DataFrame:')
print(data_frame)
print()

# Filter DataFrame for age > 28
filtered_df = data_frame[data_frame['age'] > 28]
print('Filtered DataFrame (age > 28):')
print(filtered_df)
OutputSuccess
Important Notes

Structured arrays are fast and use less memory but have limited features compared to DataFrames.

DataFrames provide many tools for data cleaning, filtering, and analysis but use more memory.

Common mistake: Trying to use DataFrame methods directly on structured arrays will cause errors.

Use structured arrays when you need speed and fixed types; use DataFrames for flexible data analysis.

Summary

Structured arrays store data with named columns and fixed types using numpy.

DataFrames are more powerful tables from pandas with many analysis features.

You can convert between structured arrays and DataFrames to use the best of both.

Practice

(1/5)
1. What is a key difference between a numpy structured array and a pandas DataFrame?
easy
A. Structured arrays automatically handle missing data, DataFrames do not.
B. Structured arrays can only store numbers, DataFrames can only store text.
C. DataFrames do not support named columns, structured arrays do.
D. Structured arrays have fixed data types per column, while DataFrames allow mixed types and more flexible operations.

Solution

  1. Step 1: Understand data type handling in structured arrays

    Structured arrays in numpy require fixed data types for each named column, meaning each column's type is set and consistent.
  2. Step 2: Compare with DataFrame flexibility

    DataFrames from pandas allow columns to have different data types and provide many flexible operations like handling missing data and complex indexing.
  3. Final Answer:

    Structured arrays have fixed data types per column, while DataFrames allow mixed types and more flexible operations. -> Option D
  4. Quick Check:

    Data type flexibility = D [OK]
Hint: Remember: structured arrays fix types, DataFrames are more flexible [OK]
Common Mistakes:
  • Thinking structured arrays can handle missing data like DataFrames
  • Assuming DataFrames cannot have mixed data types
  • Believing structured arrays only store numbers
2. Which of the following is the correct way to create a numpy structured array with fields 'name' (string) and 'age' (integer)?
easy
A. np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'int'), ('age', 'str')])
B. np.array([{'Name': 'Alice', 'age': 25}, {'Name': 'Bob', 'age': 30}])
C. np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'U10'), ('age', 'i4')])
D. np.array([['Alice'], ['Bob']], dtype=[('name', 'U10'), ('age', 'i4')])

Solution

  1. Step 1: Check dtype specification for structured arrays

    The dtype must be a list of tuples with field names and valid numpy data types, e.g., 'U10' for string and 'i4' for 4-byte integer.
  2. Step 2: Verify the data matches the dtype

    np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'U10'), ('age', 'i4')]) uses tuples matching the dtype fields correctly. np.array([{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]) uses dicts which numpy does not accept directly for structured arrays. np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'int'), ('age', 'str')]) swaps types incorrectly. np.array([['Alice', 25], ['Bob', 30]], dtype=[('name', 'U10'), ('age', 'i4')]) uses lists instead of tuples, which is invalid here.
  3. Final Answer:

    np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'U10'), ('age', 'i4')]) -> Option C
  4. Quick Check:

    Correct dtype and tuple data = A [OK]
Hint: Use tuples and correct dtype list for structured arrays [OK]
Common Mistakes:
  • Using dicts instead of tuples for structured array data
  • Mixing up data types in dtype list
  • Using lists instead of tuples for records
3. Given the code below, what will be the output?
import numpy as np
import pandas as pd

arr = np.array([(1, 'A'), (2, 'B')], dtype=[('id', 'i4'), ('label', 'U1')])
df = pd.DataFrame(arr)
print(df['label'][1])
medium
A. B
B. A
C. 1
D. Error: KeyError

Solution

  1. Step 1: Understand conversion from structured array to DataFrame

    Creating a DataFrame from a structured array converts named fields into columns with the same names.
  2. Step 2: Access the 'label' column and index 1

    df['label'] is a Series with values ['A', 'B']. Index 1 corresponds to 'B'.
  3. Final Answer:

    B -> Option A
  4. Quick Check:

    DataFrame column access = B [OK]
Hint: Structured array fields become DataFrame columns [OK]
Common Mistakes:
  • Confusing index 0 and 1 values
  • Expecting error due to structured array
  • Mixing up field names and indices
4. What is wrong with this code snippet that tries to convert a pandas DataFrame to a numpy structured array?
import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Tom', 'Jerry'], 'age': [5, 7]})
arr = np.array(df, dtype=[('name', 'U10'), ('age', 'i4')])
print(arr)
medium
A. The dtype should use 'S10' instead of 'U10' for strings.
B. The dtype argument is ignored; conversion does not create a structured array as expected.
C. The DataFrame must be converted to a list of tuples before creating the structured array.
D. There is no error; the code works correctly.

Solution

  1. Step 1: Check how numpy.array handles DataFrame input with dtype

    Passing a DataFrame directly to np.array with dtype does not convert it into a structured array; dtype is ignored and a 2D array of objects is created.
  2. Step 2: Identify correct conversion method

    To get a structured array, convert DataFrame to records (e.g., df.to_records()) before calling np.array.
  3. Final Answer:

    The dtype argument is ignored; conversion does not create a structured array as expected. -> Option B
  4. Quick Check:

    Direct np.array(df, dtype=...) ignores dtype [OK]
Hint: Convert DataFrame to records before numpy structured array [OK]
Common Mistakes:
  • Assuming dtype works directly on DataFrame in np.array
  • Not converting DataFrame to records first
  • Confusing string dtype codes
5. You have a numpy structured array with fields 'city' (string) and 'temperature' (float). You want to convert it to a pandas DataFrame, filter rows where temperature > 20, then convert back to a structured array with the same fields. Which code snippet correctly does this?
hard
A. df = pd.DataFrame(arr); filtered = df.query('temperature > 20'); result = np.array(filtered.to_records(index=False), dtype=arr.dtype)
B. df = pd.DataFrame(arr); filtered = df[df.temperature > 20]; result = np.array(filtered, dtype=arr.dtype)
C. df = pd.DataFrame(arr); filtered = df[df['temperature'] > 20]; result = np.array(filtered.to_records())
D. df = pd.DataFrame(arr); filtered = df[df['temperature'] > 20]; result = np.array(filtered.to_dict())

Solution

  1. Step 1: Convert structured array to DataFrame

    Creating a DataFrame from the structured array is straightforward: df = pd.DataFrame(arr).
  2. Step 2: Filter rows where temperature > 20

    Using df.query('temperature > 20') or df[df['temperature'] > 20] both work, but query is concise and clear.
  3. Step 3: Convert filtered DataFrame back to structured array with original dtype

    Use filtered.to_records(index=False) to get a structured array-like record array, then convert to numpy array with original dtype to keep field types consistent.
  4. Final Answer:

    df = pd.DataFrame(arr); filtered = df.query('temperature > 20'); result = np.array(filtered.to_records(index=False), dtype=arr.dtype) -> Option A
  5. Quick Check:

    Filter with query + to_records + dtype = A [OK]
Hint: Use to_records() and specify dtype when converting back [OK]
Common Mistakes:
  • Not using to_records() before np.array conversion
  • Forgetting to specify dtype on conversion back
  • Using to_dict() which is incorrect here