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

Python 理解NumPy 2D数组子设置中方括号行为的差异,python,Python,我是python新手,从基础学习python。 我有一个二维阵列(npb) 正常进行子集设置时(不带冒号),则会给出输出 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

我是python新手,从基础学习python。 我有一个二维阵列(npb)

正常进行子集设置时(不带冒号),则会给出输出

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

i、 例如,[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]是第二项,即列表
[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存储二维数组的方式。然而,(:,1)意味着
所有行,第1列
-显然不同于
npb[:][1]

npb[:]
npb
的副本,因此
npb[:][1]
只是
npb[1]
Input:       nph=np.array(npb[:][1])
Output:      3 ,4

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