Numpy索引切片不丢失维度信息

136 投票
7 回答
71996 浏览
提问于 2025-04-16 03:11

我正在使用numpy,想要索引一行,但又不想失去维度信息。

import numpy as np
X = np.zeros((100,10))
X.shape        # >> (100, 10)
xslice = X[10,:]
xslice.shape   # >> (10,)  

在这个例子中,xslice现在变成了一维的,但我希望它的形状是(1,10)。在R语言中,我会用X[10,:,drop=F]来做到这一点。请问在numpy中有没有类似的做法?我在文档里找不到,也没看到有人问过类似的问题。

谢谢!

7 个回答

32

我找到了一些不错的解决办法。

1) 使用 numpy.take(X,[10],0) 这个方法。

2) 使用这种奇怪的索引方式 X[10:11:, :]

理想情况下,这应该是默认的做法。我一直不明白为什么会丢掉某些维度。不过这就得去讨论numpy了……

125

另一种解决方案是这样做:

X[[10],:]

或者

I = array([10])
X[I,:]

当你用一个索引列表(或者一个数组)来查找数组中的元素时,数组的维度是会被保留的。这一点很好,因为你可以选择保留维度或者进行压缩。

72

最简单的方法可能就是用 x[None, 10, :],或者用更容易理解的 x[np.newaxis, 10, :]。这里的 Nonenp.newaxis 是用来增加数组的维度的,这样在切片后就能恢复到原来的样子,因为切片会去掉一个维度。

至于为什么这不是默认设置,我个人觉得数组里总是有单一维度的情况会让人很烦。估计 numpy 的开发者也有同样的感觉。

另外,numpy 对数组的广播处理得很好,所以通常没必要保留切片来源数组的维度。如果保留的话,像下面这样的代码:

a = np.zeros((100,100,10))
b = np.zeros(100,10)
a[0,:,:] = b

可能就会不太好用,或者实现起来会更加复杂。

(或者至少这是我对 numpy 开发者在切片时不保留维度信息的推测)

撰写回答