我有一段代码切片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]
答案 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_h
和indices_w
是可广播的整数索引数组的情况下,结果将具有indices_h
和indices_w
的广播形状。因此,如果您想确保结果是2D,请将索引数组设为2D。
否则,如果你想要indices_h [i]和indices_w [j]的所有组合(对于所有i,j),例如,顺序索引:
sub_array = orig_array[indices_h][:, indices_w]
有关高级索引的详细信息,请查看documentation。