Python: How can I force 1-element NumPy arrays to be two-dimensional?

When defining a numpy array you can use the keyword argument ndmin to specify that you want at least two dimensions. e.g.

arr = np.array(item_list, ndmin=2)
arr.shape
>>> (100, 1) # if item_list is 100 elements long etc

In the example in the question, just do

sub_array = np.array(orig_array[indices_h, indices_w], ndmin=2)
sub_array.shape
>>> (1,1)

This can be extended to higher dimensions too, unlike np.atleast_2d().


It sounds like you might be looking for atleast_2d. This function returns a view of a 1D array as a 2D array:

>>> arr1 = np.array([1.7]) # shape (1,)
>>> np.atleast_2d(arr1)
array([[ 1.7]])
>>> _.shape
(1, 1)

Arrays that are already 2D (or have more dimensions) are unchanged:

>>> arr2 = np.arange(4).reshape(2,2) # shape (2, 2)
>>> np.atleast_2d(arr2)
array([[0, 1],
       [2, 3]])
>>> _.shape
(2, 2)

Are you sure you are indexing in the way you want to? In the case where indices_h and indices_w are broadcastable integer indexing arrays, the result will have the broadcasted shape of indices_h and indices_w. So if you want to make sure that the result is 2D, make the indices arrays 2D.

Otherwise, if you want all combinations of indices_h[i] and indices_w[j] (for all i, j), do e.g. a sequential indexing:

sub_array = orig_array[indices_h][:, indices_w]

Have a look at the documentation for details about advanced indexing.