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

时间:2010-08-23 20:06:22

标签: python numpy

我正在使用numpy并希望索引一行而不会丢失维度信息。

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

在这个例子中,xslice现在是1维,但我希望它是(1,10)。 在R中,我会使用X [10,:,drop = F]。 numpy中有类似的东西吗?我在文档中找不到它,也没有看到类似的问题。

谢谢!

6 个答案:

答案 0 :(得分:76)

另一个解决方案是

X[[10],:]

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

当索引的列表(或数组)执行索引时,将保留数组的维度。这很好,因为它让你可以选择保持尺寸和挤压。

答案 1 :(得分:45)

最简单的做法x[None, 10, :]或等效(但更具可读性)x[np.newaxis, 10, :]

至于为什么它不是默认值,就个人而言,我发现不断地使用具有单一尺寸的数组会很快变得烦人。我猜这些笨拙的开发者也有同感。

此外,numpy处理广播阵列非常好,所以通常没有理由保留切片来自的数组的维度。如果你这样做,那么就像:

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

要么不起作用,要么实施起来要困难得多。

(或者至少那是我猜测numpy dev在切片时丢弃尺寸信息的推理)

答案 2 :(得分:26)

我找到了一些合理的解决方案。

1)使用numpy.take(X,[10],0)

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

理想情况下,这应该是默认值。我永远不明白为什么尺寸会掉落。但这是对numpy的讨论......

答案 3 :(得分:2)

这是我更喜欢的选择。而不是使用单个数字编制索引,而是使用范围进行索引。也就是说,使用 @Override public void configure(WebSecurity web) { web .ignoring() .antMatchers(HttpMethod.OPTIONS) .antMatchers(HttpMethod.TRACE) .antMatchers(HttpMethod.PATCH) .antMatchers(HttpMethod.PUT) .antMatchers(HttpMethod.POST) .antMatchers(HttpMethod.GET); } 。 (请注意,X[10:11,:]不包含11)。

10:11

这也使您可以轻松理解更多维度,而无需import numpy as np X = np.zeros((100,10)) X.shape # >> (100, 10) xslice = X[10:11,:] xslice.shape # >> (1,10) 费力地弄清楚要使用哪个索引的轴。同样,也无需为数组大小做额外的记账工作,只需None即可用于常规索引中的任何i:i+1

i

答案 4 :(得分:1)

要通过gnebehay添加到the solution involving indexing by lists or arrays,还可以使用元组:

X[(10,),:]

答案 5 :(得分:0)

如果要在运行时按长度可能为1的数组建立索引,这尤其令人讨厌。在这种情况下,有np.ix_

some_array[np.ix_(row_index,column_index)]