Numpy索引切片不丢失维度信息
我正在使用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, :]
。这里的 None
或 np.newaxis
是用来增加数组的维度的,这样在切片后就能恢复到原来的样子,因为切片会去掉一个维度。
至于为什么这不是默认设置,我个人觉得数组里总是有单一维度的情况会让人很烦。估计 numpy 的开发者也有同样的感觉。
另外,numpy 对数组的广播处理得很好,所以通常没必要保留切片来源数组的维度。如果保留的话,像下面这样的代码:
a = np.zeros((100,100,10))
b = np.zeros(100,10)
a[0,:,:] = b
可能就会不太好用,或者实现起来会更加复杂。
(或者至少这是我对 numpy 开发者在切片时不保留维度信息的推测)