Python 子阵列numpy阵列时保持维度的最佳方法是什么?

Python 子阵列numpy阵列时保持维度的最佳方法是什么?,python,numpy,array-indexing,Python,Numpy,Array Indexing,假设我有一个标准的numpy数组,比如 a = np.arange(6).reshape((2,3)) 当我对阵列进行子阵列时,通过执行以下任务 a[1, :] 我将失去维度,它将变成1D并打印,array([3,4,5]) 当然,列表是二维的,您最初希望保持维度。因此,我必须做一项乏味的工作,例如 b=a[1, :] b.reshape(1, b.size) 为什么子阵列时numpy会降低维度? 保持维度的最佳方法是什么,因为a[1,:]。重塑(1,a.size)将被破坏?只需使用切片

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

a = np.arange(6).reshape((2,3))
当我对阵列进行子阵列时,通过执行以下任务

a[1, :]
我将失去维度,它将变成1D并打印,
array([3,4,5])
当然,列表是二维的,您最初希望保持维度。因此,我必须做一项乏味的工作,例如

b=a[1, :]
b.reshape(1, b.size)
为什么子阵列时numpy会降低维度?


保持维度的最佳方法是什么,因为
a[1,:]。重塑(1,a.size)
将被破坏?

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

a[1:2]

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

OP说“
a[1,:].重塑(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


那么
a[[1],:]
如何处理要求保持大小为1维的子阵列?将行(或列)视为1d数组有什么错?
a[1:2,:]
也有效(参见John Zwinck的答案)。我确信这个问题是重复的,但它需要正确的搜索词来查找前面的问题。@Divakar复制了一份。不知道为什么这被否决了。这似乎是正确的,除非我误解了这个问题。@MarkMeyer:这是正确的,但是在创建堆栈溢出帐户的过程中没有智力或道德测试,所以有时你会看到非法的否决票。哦,好吧。确实,完美,简单。实际上,我更喜欢
a[1,None]
,尤其是如果索引不是
1
,而是更复杂的表达式。你真的不想输入像
a[n*m*(k-1)+m*(l-1)+u:n*m*(k-1)+m*(l-1)+u+1]这样的东西,对吧?切片和索引有什么区别?
a[1][None]
创建了一个不必要的中间层
a[1,None]
a[None,1]
更好。@PaulPanzer我已经更新了我的答案,以反映整个页面中的一些评论
a[1, None]
a[1, np.newaxis]
a[1].reshape(1, a.shape[1]) # Use shape, not size
a[[1]]