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

时间:2015-07-29 10:44:38

标签: python arrays numpy

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

>>> sub_array = orig_array[indices_h, indices_w]
>>> sub_array.shape
(1,)

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

>>> sub_array.shape
(1,1)

我知道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

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

增加:

正如https://stackoverflow.com/a/31698471/865169所指出的那样,我的索引编写错误。我真的很想做:

sub_array = orig_array[indices_h][:, indices_w]

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

sub_array = np.atleast_2d(orig_array[indices_h])[:, indices_w]

2 个答案:

答案 0 :(得分:10)

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

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

已经2D(或具有更多尺寸)的阵列不变:

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

答案 1 :(得分:1)

您确定要以您希望的方式编制索引吗?在indices_hindices_w是可广播的整数索引数组的情况下,结果将具有indices_hindices_w的广播形状。因此,如果您想确保结果是2D,请将索引数组设为2D。

否则,如果你想要indices_h [i]和indices_w [j]的所有组合(对于所有i,j),例如,顺序索引:

sub_array = orig_array[indices_h][:, indices_w]

有关高级索引的详细信息,请查看documentation