为什么带括号和逗号的numpy数组的索引行为不同?

时间:2016-06-30 04:27:54

标签: python numpy indexing slice

我倾向于使用括号来索引numpy数组(矩阵),但我注意到当我想切片数组(矩阵)时我必须使用逗号表示法。为什么是这样?例如,

>>> x = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> x
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> x[1][1]
4                 # expected behavior
>>> x[1,1]
4                 # expected behavior
>>> x[:][1]
array([3, 4])     # huh?
>>> x[:,1]
array([2, 4, 6])  # expected behavior

3 个答案:

答案 0 :(得分:17)

此:

x[:, 1]

表示"沿第一个轴取x的所有索引,但沿第二个轴取第一个索引1。

此:

x[:][1]

表示"沿着第一个轴取x的所有索引(所以x全部),然后沿结果的第一个轴取索引1 #34 ;.您正在将1应用于错误的轴。

x[1][2]x[1, 2]只是等价的,因为使用整数索引数组会将所有剩余的轴移向形状的前面,因此x[1]的第一个轴是第二个轴x。这根本没有概括;你应该几乎总是使用逗号而不是多个索引步骤。

答案 1 :(得分:3)

切割多维数组时,如果提供的索引数少于轴数,则缺少的索引将被视为完整切片。 因此,当您在调用final=data.frame() for(i in unique(data$company)){ temp=data[data$company==i,] for(j in unique(temp$year)){ if(nrow(temp[temp$year==j,])==4) final=rbind(final,data.frame(company=i,Year=j)) } } 时基本上正在执行x[:][1] 因此,x[:,:][1,:]只会返回x本身。

答案 2 :(得分:0)

对此的真正解释是在2个方括号[] []的情况下,第一个方括号(x [])创建一个引用多维数组的第一个维的临时数组。

虽然x [] []的第二个括号将应用于已经创建的临时数组。

因此没有真正的危险发生。由于所描述的行为,当您将切片与多个方括号组合使用时,基本上第一个方括号已经选择了numpy数组的一部分,而第二个方括号进入了已选择的数组。

此处也提供了说明:numpy.org/devdocs/user/basics.indexing.html