上节课我们一起学习了Numpy的基本功能和它的部分基础知识。今天我们一起接着来学习剩下的部分。
5.一维数组的索引和切片
(1)一维数组的切片操作与Python列表的切片操作很相似。例如,我们可以用下标3~7来选取元素3~6:
a = np.arange(9)
a[3:7]
(2)也可以用下标0~7,以2为步长选取元素:
a[:7:2]
利用负数下标翻转数组:
a[::-1]
6.多维数组的切片和索引
(1)先用arange函数创建一个数组并改变其维度,使之变成一个三维数组,2×3×4的三维数组:可以形象地把它看做一个两层楼建筑,每层楼有12个房间,并排列成3行4列。
b = arange(24).reshape(2,3,4)
b.shape
(2)我们可以用三维坐标来选定任意一个房间,即楼层、行号和列号。例如,选定第1层楼、第1行、第1列的房间(也可以说是第0层楼、第0行、第0列,这只是习惯问题),可以这样表示:
b[0,0,0]
(3)如果我们不关心楼层python矩阵切片,也就是说要选取所有楼层的第1行、第1列的房间,那么可以将第1个下标用英文标点的冒号:来代替:
b[:,0,0]
(4)选取第1层楼的所有房间:
b[0, :, :]
(5)多个冒号可以用一个省略号(...)来代替,因此上面的代码等价于:
b[0, ...]
(6)选取第1层楼、第2排的所有房间:
b[0,1]
(7)再进一步,我们可以在上面的数组切片中间隔地选定元素:
b[0,1,::2]
(8)如果要选取所有楼层的位于第2列的房间,即不指定楼层和行号,用如下代码即可:
b[...,1]
(9)类似地,我们可以选取所有位于第2行的房间,而不指定楼层和列号:
b[:,1]
(10)如果要选取第1层楼的所有位于第2列的房间,在对应的两个维度上指定即可:
b[0,:,1]
(11)如果要选取第1层楼的最后一列的所有房间,使用如下代码:
b[0,:,-1]
(12)如果要反向选取第1层楼的最后一列的所有房间,使用如下代码:
b[0,::-1, -1]
(13)在该数组切片中间隔地选定元素:
b[0,::2,-1]
(14)如果在多维数组中执行翻转一维数组的命令,将在最前面的维度上翻转元素的顺序,在我们的例子中将把第1层楼和第2层楼的房间交换:
b[::-1]
(15)从数组中抽取元素,np.extract
· 生成选择偶数元素的条件变量:
a = np.arange(7)
condition = (a % 2) == 0
np.extract(condition, a)
· 使用nonzero函数抽取数组中的非零元素:
np.nonzero(a)
7.改变数组的维度
(1)ravel 我们可以用ravel函数完成展平的操作:
b.ravel()
(2)flatten 这个函数恰如其名,flatten就是展平的意思,与ravel函数的功能相同。
不过,flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图(view):
b.flatten()
(3)用元组设置维度: 除了可以使用reshape函数,我们也可以直接用一个正整数元组来设置数组的维度,如下所示:
b.shape = (6,4)
(4)transpose 在线性代数中,转置矩阵是很常见的操作。对于多维数组,我们也可以这样做:
b.transpose()
(5)resize和reshape函数的功能一样,但resize会直接修改所操作的数组:
b.resize((2,12))
8.数组的组合
NumPy数组有水平组合、垂直组合和深度组合等多种组合方式,我们将使用vstack、dstack、hstack、column_stack、row_stack以及concatenate函数来完成数组的组合。
a = arange(9).reshape(3,3)
b = 2 * a
(1)水平组合:hstack函数python矩阵切片,用concatenate函数来实现同样的效果
hstack((a, b))
concatenate((a, b), axis=1)
(2)垂直组合:vstack,将concatenate函数的axis参数设置为0即可实现同样的效果
vstack((a, b))
concatenate((a, b), axis = 0)
(3)深度组合:就是将一系列数组沿着纵轴(深度)方向进行层叠组合。举个例子,有若干张二维平面内的图像点阵数据,我们可以将这些图像数据沿纵轴方向层叠在一起,这就形象地解释了什么是深度组合。
dstack((a, b))
(4)列组合 column_stack函数对于一维数组将按列方向进行组合,于二维数组,column_stack与hstack的效果是相同的
np.column_stack((a,b))
hstack((a, b))
(5)行组合 当然,NumPy中也有按行方向进行组合的函数,它就是row_stack。对于两个一维数组,将直接层叠起来组合成一个二维数组。对于二维数组,row_stack与vstack的效果是相同的
row_stack((a,b))
vstack((a, b))
9.数组的分割
(1)水平分割:下面的代码将把数组沿着水平方向分割为3个相同大小的子数组:
调用split函数并在参数中指定参数axis=1
hsplit(a, 3)
split(a, 3, axis=1)
(2)垂直分割:vsplit函数将把数组沿着垂直方向分割:
调用split函数并在参数中指定参数axis=0
vsplit(a, 3)
split(a, 3, axis=0)
(3)深度分割 :dsplit函数将按深度方向分割数组。
c = arange(27).reshape(3, 3, 3)
dsplit(c, 3)
10.数组的属性
(1)shape和dtype属性以外,ndarray对象还有很多其他的属性
(2)ndim属性,给出数组的维数,或数组轴的个数:
print(b)
b.ndim
(3)size属性,给出数组元素的总个数,如下所示:
b.size
(4)itemsize属性,给出数组中的元素在内存中所占的字节数:
b.itemsize
(5)如果你想知道整个数组所占的存储空间,可以用nbytes属性来查看。这个属性的值其实就是itemsize和size属性值的乘积:
b.nbytes
b.size * b.itemsize
(6)T属性的效果和transpose函数一样,对于一维数组,其T属性就是原数组:
b.T
(7)在NumPy中,复数的虚部是用j表示的。例如,我们可以创建一个由复数构成的数组:
b = array([1.j + 1, 2.j + 3])
(8)real属性,给出复数数组的实部
b.real
(9)imag属性,给出复数数组的虚部
b.imag
———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99