我倾向于使用括号来索引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
答案 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数组的一部分,而第二个方括号进入了已选择的数组。