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



我是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[x][y]被Python解释为(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] 是第 2 项,即列表[3,4]

npb[x,y]numpy对象(以及其他类似的东西,如数据帧(的特殊选择器,Python 将其读取为:get (x,y) from npb,其中 x 表示要获取哪一行,y 表示要获取哪列。这样的复合索引对大多数 Python 集合对象无效 - 它仅适用于专门为处理它而制作的东西,例如 numpy.array。现在 (0,1( 表示第 0 行,第 1 列 - 恰好与"来自 npb[0] 的元素 1"npb[0][1]相同,仅仅是因为 numpy 存储 2-D 数组的方式。但是,(:,1( 表示all rows, column 1- 显然与您从npb[:][1]中获得的"来自 npb[:] 的元素 1"不同。

最新更新