5 Best Ways to Create a NumPy Array of Arrays in Python

πŸ’‘ Problem Formulation: Python developers often encounter situations where they need to create a multi-dimensional array, or an array of arrays, using the NumPy library. This task is common in scientific computing, machine learning and data analysis. For example, you might need to transform a list of lists into a structured NumPy array for efficient computation. This article explores various methods to accomplish this, with the goal of producing a NumPy array where each element is an array itself, potentially of varying sizes.

Method 1: Using numpy.array() Function

One of the most straightforward methods to create a NumPy array of arrays is utilizing the numpy.array() function. When this function is passed a list of lists (or any list-like structure), it returns a NumPy ndarray object that preserves the nested list structure, essentially creating an array of arrays if the sublists are of equal length and an array of objects if they’re not.

β™₯️ Info: Are you AI curious but you still have to create real impactful projects? Join our official AI builder club on Skool (only $5): SHIP! - One Project Per Month

Here’s an example:

import numpy as np

nested_list = [[1, 2], [3, 4], [5, 6]]
numpy_array_of_arrays = np.array(nested_list)

print(numpy_array_of_arrays)

Output:

[[1 2]
 [3 4]
 [5 6]]

This code snippet first imports the NumPy library. It then defines a Python list of lists named nested_list. By passing this list to np.array(), we create a NumPy array where each sublist becomes a sub-array. The print() statement outputs a 2D structured NumPy array.

Method 2: Using numpy.vstack() Function

The numpy.vstack() function is used for vertically stacking arrays. If you have several 1D arrays and you want to stack them into a 2D array, vstack() is a powerful tool. It requires that all arrays have the same number of columns.

Here’s an example:

import numpy as np

array_one = np.array([1, 2, 3])
array_two = np.array([4, 5, 6])
array_three = np.array([7, 8, 9])

combined_array = np.vstack((array_one, array_two, array_three))

print(combined_array)

Output:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

In this example, we create three 1-dimensional NumPy arrays. We then use the np.vstack() function to vertically stack these arrays, resulting in a new 2D NumPy array combined_array. The arrays are stacked in the order they are passed to vstack().

Method 3: Using numpy.concatenate() Function

numpy.concatenate() provides versatility in combining arrays. While commonly used for 1D arrays, it can concatenate multi-dimensional arrays provided they share the same shape, except for the dimension along which you’re concatenating. This makes it ideal for creating an array of arrays along a specified axis.

Here’s an example:

import numpy as np

array_one = np.array([[1, 2]])
array_two = np.array([[3, 4]])

combined_array = np.concatenate((array_one, array_two), axis=0)

print(combined_array)

Output:

[[1 2]
 [3 4]]

This snippet demonstrates the use of np.concatenate() to combine two 2D arrays along the first axis (rows). Each array is passed as an argument, and the axis=0 specifies that they should be stacked vertically, row-wise. The result is a single 2D array composed of the input arrays.

Method 4: List Comprehension with numpy.array()

List comprehension in Python, combined with the numpy.array() function, can create a NumPy array of arrays in a concise and pythonic way. This method is particularly useful when the arrays are generated based on some condition or logic defined in the comprehension.

Here’s an example:

import numpy as np

lists = [[i for i in range(j, j+3)] for j in range(1, 10, 3)]
numpy_array = np.array(lists)

print(numpy_array)

Output:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

This code uses list comprehension to create a list of lists, where each inner list contains three consecutive integers. The list comprehension iterates over the numbers 1, 4, and 7 to create the starting point for each inner list. The result is converted into a NumPy array using np.array() and printed out.

Bonus One-Liner Method 5: Using numpy.arange() and reshape()

For cases where the array of arrays has a predictable structure, such as sequence-filled matrices, NumPy’s arange() function can be used in combination with reshape() method to create the array in a single line of code.

Here’s an example:

import numpy as np

numpy_array = np.arange(1, 10).reshape((3, 3))

print(numpy_array)

Output:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

In this concise one-liner, np.arange(1, 10) creates a 1D array of numbers from 1 to 9. The reshape((3, 3)) method then reshapes this array into a 3×3 2D array, resulting in a perfectly structured array of arrays.

Summary/Discussion

  • Method 1: Using numpy.array(). Straightforward and versatile. Handles equal and unequal lengths of sub-arrays. Possible object dtype if sub-arrays are unequal.
  • Method 2: Using numpy.vstack(). Effective for stacking 1D arrays vertically. Requires arrays to have the same number of columns.
  • Method 3: Using numpy.concatenate(). Highly flexible for different dimensions along specific axis. Requires same shape except for the concatenation axis.
  • Method 4: List Comprehension with numpy.array(). Pythonic and useful for conditional array creations. Involves Python lists overhead.
  • Bonus Method 5: Using numpy.arange() and reshape(). Quick and efficient for patterned data. Limited to equally sized, predictable arrays.