Python:我如何强制1元素NumPy数组是二维的?

Tho*_*sen 6 python arrays numpy

我有一段代码切片2D NumPy数组并返回结果(子)数组.在某些情况下,切片仅索引一个元素,在这种情况下,结果是一个元素数组:

>>> sub_array = orig_array[indices_h, indices_w]
>>> sub_array.shape
(1,)
Run Code Online (Sandbox Code Playgroud)

如何以一般方式强制此数组为二维?即:

>>> sub_array.shape
(1,1)
Run Code Online (Sandbox Code Playgroud)

我知道这很sub_array.reshape(1,1)有效,但我希望能够将其应用到sub_array一般而不用担心其中的元素数量.换句话说,我想组成一个(轻量级)操作,将shape-(1,)数组转换为shape-(1,1)数组,将形状(2,2)数组转换为一个形状 - (2,2)阵列等我可以做一个函数:

def twodimensionalise(input_array):
     if input_array.shape == (1,):
         return input_array.reshape(1,1)
     else:
         return input_array
Run Code Online (Sandbox Code Playgroud)

这是我能得到的最好的,还是NumPy有更"本土"的东西?

加成:

正如/sf/answers/2218893001/中指出的那样,我的索引编写错误.我真的很想做:

sub_array = orig_array[indices_h][:, indices_w]
Run Code Online (Sandbox Code Playgroud)

当只有一个条目indices_h,但将其与np.atleast_2d另一个答案中的建议组合时,这不起作用,我到达:

sub_array = np.atleast_2d(orig_array[indices_h])[:, indices_w]
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 11

听起来你可能正在寻找atleast_2d.此函数将1D数组的视图作为2D数组返回:

>>> arr1 = np.array([1.7]) # shape (1,)
>>> np.atleast_2d(arr1)
array([[ 1.7]])
>>> _.shape
(1, 1)
Run Code Online (Sandbox Code Playgroud)

已经是2D(或具有更多尺寸)的数组不变:

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


ber*_*lem 5

定义 numpy 数组时,您可以使用关键字参数ndmin来指定您至少需要两个维度。例如

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

在问题的例子中,只需做

sub_array = np.array(orig_array[indices_h, indices_w], ndmin=2)
sub_array.shape
>>> (1,1)
Run Code Online (Sandbox Code Playgroud)

与 不同的是,这也可以扩展到更高的维度np.atleast_2d()