理解NumPy 2D数组子集中方括号行为的差异

3

我是Python的新手,正在从基础开始学习。我有一个二维数组(npb)。

npb=np.array([[1,2],
              [3,4],
              [5,6],
              [7,8]]);

当正常进行子集操作时(不使用冒号),它会给出输出,

Input:       nph=np.array(npb[0][1])    
Output:      2

Input:       nph=np.array(npb[0 ,1])   
Output:      2

但是当使用冒号时,它会输出结果。
Input:       nph=np.array(npb[:][1])
Output:      3 ,4

Input:       nph=np.array(npb[: ,1])          
Output:      2 ,4, 6 ,8

即[0][1]和[0,1]得到相同的结果,而[:][1]和[:,1]却不是。为什么?

npb[:]npb的一个副本,所以npb[:][1]就等于npb[1] - bobrobbob
1个回答

4
两种索引的形式看起来相似,但本质上是不同的,尽管它们在处理数组单个元素时产生了相同的结果。
Python会将npb[x][y]解释为(nbp[x])[y],也就是说, - 首先从npb中获取第x个元素,然后取其结果的第y个元素。因此,对于npb[0][1],npb[0]是[1,2],[1,2][1]是2。在这里,您只是将npb作为列表的列表进行处理。 - 对于npb[:][1],Python会将其解释为(npb[:])[1],即:npb[:]是npb的副本,而其中[1]表示第二个项目,即列表[3,4]npb[x,y]是特殊选择器,用于numpy对象(以及其他类似数据框架的东西),Python将其读作:从npb获取(x,y),其中x表示要获取哪些行,y表示要获取哪些列。大多数Python集合对象都无法使用这样的组合索引 - 它仅适用于专门处理它的东西,例如numpy.array。现在(0,1)表示第0行,第1列 - 恰好与npb[0][1]相同,即'从npb [0]获取第1个元素',仅因为numpy存储二维数组的方式。然而,(:,1)表示所有行,第1列 - 显然与npb[:][1]得到的'从npb[:]获取第1个元素'不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接