子数组化numpy数组时,保持维数的最佳方法是什么?

时间:2018-12-16 08:04:09

标签: python numpy array-indexing

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

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

当我对数组进行子数组处理时,通过执行

a[1, :]

我将失去尺寸,它将变成一维并打印array([3, 4, 5]) 当然,列表最初是2D的,因此您要保持尺寸。所以我必须要做一个繁琐的任务,例如

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

为什么子数组时numpy会降低维数?

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

2 个答案:

答案 0 :(得分:1)

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

a[1:2]

答案 1 :(得分:0)

尽管我同意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]]