numpy生成数组的方法

python 数组 分片 python 数组切片_python 数组 分片

多维数组的理解

python 数组 分片 python 数组切片_二维_02

   

python 数组 分片 python 数组切片_python_03

python 数组 分片 python 数组切片_python_04

     

python 数组 分片 python 数组切片_三维数组_05

..........

        (a)                        (b)                        (c)                                (d)

简单理解,一维数组就是一个向量,二维数组是一个矩阵,三维数组就是有几个矩阵,四维数组就是有几个这样的三维立方体,如上图,将图a复制4份就变成了图b的二维,将图b复制3份就变成了图c的三维,将图c复制3份就变成了图d的四维,所以将图d复制n份就会变成五维,以此类推。。

多维数组的切片

单维数组的切片是基于索引号,多维数组的切片是基于维度的。比如有一个一维数组:

>>>a = np.arange(9)
>>>print(a)
[0 1 2 3 4 5 6 7 8]

>>>print(a[0:3])
[0 1 2]
>>>print(a[:])
[0 1 2 3 4 5 6 7 8]

使用 [:] 表示从开始到结束的切片,所有的索引值都是从0开始的,切片操作都是左闭右开的区间,比如[0:2]意思是0,1

将一维数组变成二维数组:

>>>a = np.arange(9).reshape(3,3)
>>>print(a)
[[0 1 2]
 [3 4 5]
 [6 7 8]]

>>>print(a[0,1])
1

二维数组的切片就是选取第几行第几列的值,上述代码取得就是第0行第1列的值

下面生成一个三维数组:

>>>a = np.arange(18).reshape(2,3,3)
>>>print(a)
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]]

>>>print(a[0,1:2,0:2])
[[3 4]]

三维数组的切片就是从维数最高开始选取,a[0,1:2,0:2]中的0表示选取第0个矩阵

python 数组 分片 python 数组切片_数组_06

 ,1:2表示选取第0个矩阵的第1行

python 数组 分片 python 数组切片_数组_07

,0:2表示第0个矩阵的0到1列

python 数组 分片 python 数组切片_数组_08


其中[:]表示某个维度下的所有值,如下图代码:a[0,1,:]中的:表示所有列,a[:,:,:]表示所有矩阵的所有行以及所有列。

>>>a = np.arange(18).reshape(2,3,3)
>>>print(a)
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]]
>>>print(a[0,1,:])
[3 4 5]

>>>print(a[:,:,:])
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]]

 其中多个冒号可以用一个省略号(…)来代替,比如上面的a[:,:,:]可以用a[...]代替。

最后,再补充一点:我们说a[0:1]和a[0]都表示取第0维,那么他们之间有什么区别呢?区别就是当我们写a[0]的时候,取出来的数组会降一维,而a[0:1]保持不变。举个例子,对一个三维数组进行切片操作a[0,1:2,0:2],其中当操作完a[0]的时候数组从三维变成了二维,接着操作a[1:2]数组并不会从二维变成一维,还是保持二维,当然a[0:2]也是继续保持二维,没有降维操作!!!

之前看到过一个很形象的比如,一维数组呢其实就是一条线,二维数组就是一个面,三维数组就是多个面组成的一本书,四维数组就是多本书组成的书架,五维数组就是多个书架,,,至于多维数组的切片也就是从哪个书架上取哪本书,然后翻到哪一页,找到哪一个知识点。

也可以参考

如有错误,还请指正!!!