对 numpy 数组进行子排列时保持维度的最佳方法是什么?

What is the best way to keep dimensionality when subarraying numpy arrays?

假设我有一个标准的 numpy 数组,例如

a = np.arange(6).reshape((2,3))

当我对数组进行子排列时,通过执行

这样的任务
a[1, :]

我会失去维度,它会变成一维并打印,array([3, 4, 5]) 当然,列表是二维的,您最初想要保持维度。所以我必须做一个乏味的任务,比如

b=a[1, :]
b.reshape(1, b.size)

为什么numpy在子数组化的时候会降维?

保持维度的最佳方法是什么,因为 a[1, :].reshape(1, a.size) 会中断?

只使用切片而不是索引,形状将被保留:

a[1:2]

虽然我同意 John Zwinck 的回答,但我想提供一个替代方案,以防万一,无论出于何种原因,您被迫使用索引(而不是切片)。

OP 说“a[1, :].reshape(1, a.size) 会中断”:

您可以像这样向 numpy 数组添加维度:

b = a[1]
# array([3, 4, 5]
b = a[1][np.newaxis]
# array([[3, 4, 5]])

(请注意 np.newaxis None,但使用 np.newaxis 可读性更高)


正如评论(@PaulPanzer 和@Divakar)中所指出的,实际上有很多方法可以完成同样的事情(同样,使用索引而不是切片):

这些不制作副本(每个影​​响中更改的数据a

a[1, None]
a[1, np.newaxis]
a[1].reshape(1, a.shape[1]) # Use shape, not size

这个确实复制了一份(数据独立于a

a[[1]]