我正在使用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中有类似的东西吗?我在文档中找不到它,也没有看到类似的问题。
谢谢!
答案 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)]