Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

时间:2024-10-08 15:03:20

一:数组的属性

每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型)

二:数组索引

和python列表一样,Numpy的索引在一维数组中,也可以通过中括号重指定索引获取第i个值(从0开始)

如:

x1 = [1,2,3,4,5,6,7,8]

print(x1[0])

out: 1

比较有用的一个是,numpy支持负值索引,如print(x1[-1])

out:8

负值索引的时候是从-1开始的,-1表示倒数第一个数组位置对应的值

同样多维数组中,可以用逗号分隔索引元组获取元素,如:

x2 = [[3,5,2,4]

     [7,6,8,8]

       [1,6,7,7]]

x2 [0,0]

out:3

也可以用负值来索引,x2[-1,-1]

out:7

三:数组切片

切片的意思就是获取子数组,NumPy切片语法和Python列表的标准切片语法相同.为了获取数组x的一个切片,可以用以下方式:

x[start:stop:step]

如果以上3个参数都未指定,那么默认就是[0:0:1]

因为跟python列表的语法基本相同,大概举例一下,就不啰嗦了:

1.一维数组

x[:5]  #前五个元素

x[5:] #索引五之后的元素

x[4:7] #第4-7位置的元素

x[::2] #每隔一个位置取一个元素

2.多维数组

多维数组采用同样的方式,用逗号分隔.

x[:2,:3]  #两行,三列

x[:3,::2]  #所有行,每个一列取一个元素

x[::-1,::-1] #逆序数组

3.获取数组的行和列

常见的需求是获取数组的单行和单列.可以将索引与切片组合起来实现这个功能,用一个冒号(:)表示空切片

x2[:,0]   #x2的第一列

x2[0,:]   #x2的第一行

在获取行时,出于语法简洁,可以省略空的切片:

x2[0]   #等于 x2[0,:]  第一行

数组切片有一点非常重要,那就是数组切片返回的是数组数组的视图,而不是数组的副本.python列表切片是值的副本.也就是说如果改变了NumPy数组切片的值后,原始的数组值也会跟着改变.

而如果改变python列表切片的值,原列表的值并不受影响.如下:

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

可以看到x2_sub是x2的切片数组,当我们改变了x2_sub[0,0]的值后,x2对应位置的值也跟着发生变化了.

这种默认的处理方式实际上是非常有用的:它意味着在处理非常大的数据集时,可以获取或处理这些数据的片段,而不用复制底层的数据缓存.

既然上面有提到numpy数组的切片子数组是视图,改变切片的值会影响到原数组.那么当我们需要用到numpy数组的副本值的时候怎么处理?

这就要用到numpy的数组有copy()方法

如:

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

以上我们通过copy x2_sub_copy[:2,:2] 两行两列的子数组,并改变其子数组副本中的值,但结果并没有影响x2数组

四:数组的形状(shape)

数组的形状更多涉及的内容是数组的变形,也就是一维数组和多维数组,以及多维与多维数组之间的转换问题;主要通过reshape函数来实现;

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

gitd0 是一个一维数组,通过reshape函数转成了3x3的二维数组gird1,可以看到通过reshape函数转换后,gird0本身的形状(值)并没有改变.

因此我们大致可以理解为reshape函数转换的结果其实是一个副本.

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

注意:用reshape函数来转换数组的形状,要使转换成功有一个前提条件,那就是原始数组的大小必须和变形后的数组大小一致.

另外一个常见的变形模式是一维数组转变为二维的行或列的矩阵,简单地在一个切片操作中利用newaxis关键字:

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

五.数组的拼接与分裂

数组的拼接和分裂是针对的多个数组的操作.

1.数组的拼接

拼接或连接NumPy中的两个数组主要由np.concatenate,np.vstack和np.hstack例程实现

其中 np.concatenate将数组元组或数组列表作为第一个参数

一维数组:

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

二维数组拼接:

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

concatenate拼接的时候,如果没有特别指出 axis ,则默认沿着第一个轴拼接(垂直方向)

沿着固定维度处理数组时,使用np.vstack(垂直栈)和np.hstack(水平栈)函数会更直观简洁一些

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

进行数组拼接的时候,注意拼接的方向,数据位要对应上,如上面的垂直方向拼接的时候,所接的数组水平方向位数要跟被接数组的是一样3位

2.数组的分裂

数组的分裂和拼接是反方向的.分裂可以通过np.split,np.hsplit,vsplit函数来实现.

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

split(x,[3,5])  其中的3和5是记录的分裂点的位置,表示的是在数组的 x[3]位置开始设置分裂点,也可以看成是第3个数位后面设置分裂点,方便理解就行.

这种通过设置分裂点的方式,分裂得出的子数组数会比分裂点多1

vsplit,hsplit和split的用法类似,

Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

同样的vsplit(grid,[1])  其中[1]和split中的参数是一样的,记录的是分裂点的位置

另外还可以进行第三个维度的分裂,比较少用,可以用到函数 np.dsplit ,有需要的时候再参考资料