python数据分析基础之Numpy库详解(二)

一维数组的索引与切片

  • 一维数组的切片操作与Python列表的切片操作很相似。例如,我们可以用下标2~6来选取元素2,3,4,5
import numpy as np
arr=np.arange(7)
arr[2:6]

在这里插入图片描述

  • 也可以用下标0~7,以2为步长选取元素:
arr[0:7:2]

在这里插入图片描述

  • 和Python中使用列表一样,我们也可以利用负数下标翻转数组:
arr[::-1]

在这里插入图片描述

多维数组的切片与索引

  • ndarray支持在多维数组上的切片操作。为了方便起见,我们可以用一个省略号()来表示遍历剩下的维度

  • 如下举例:首先我们使用arange函数创建一个数组并改变其维度,使之变成一个三维数组:

arr = np.arange(24).reshape((2, 3, 4))
arr.shape

在这里插入图片描述

arr

在这里插入图片描述

  • 多维数组arr中有0~23的整数,共24个元素,是一个2×3×4的三维数组。我们可以形象地把它看做一个两层楼建筑,每层楼有12个房间,并排列成3行4列。或者,我们也可以将其看成是excel表格中工作表(sheet)、行和列的关系。可以看出,reshape函数的作用是改变数组的“形状”,也就是改变数组的维度,其参数为一个正整数元组,分别指定数组在每个维度上的大小

  • 如果指定的维度和数组的元素数目不相吻合,函数将抛出异常

  • 我们可以用三维坐标来选定任意一个房间,即楼层、行号和列号。例如,选定第1层楼、 第1行、第1列的房间(也可以说是第0层楼、第0行、第0列,这只是习惯问题),可以这样表示:

arr[0,0,0]

在这里插入图片描述

  • 如果我们不关心楼层,也就是说要选取所有楼层的第1行、第1列的房间,那么可以将第1 个下标用英文标点的冒号:来代替:
arr[:,0,0]

在这里插入图片描述

  • 选取第一层的所有房间:
arr[0]

在这里插入图片描述

  • 我们还可以这样写,选取第1层楼的所有房间:
arr[0,:,:
]

在这里插入图片描述

  • 多个冒号可以用一个省略号(…)来代替,因此上面的代码等价于:
arr[0,...]

在这里插入图片描述

  • 进而我们可以选取第1层楼、第2排的所有房间:
arr[0,1]

在这里插入图片描述

  • 再进一步,我们可以在上面的数组切片中间隔地选定元素:
arr[0, 1, ::2]

在这里插入图片描述

  • 如果要选取所有楼层的位于第2列的房间,即不指定楼层和行号,用如下代码即可:
arr[..., 1]

在这里插入图片描述

  • 类似地,我们可以选取所有位于第2行的房间,而不指定楼层和列号:
arr[:, 1]

在这里插入图片描述

  • 如果要选取第1层楼的所有位于第2列的房间,在对应的两个维度上指定即可:
arr[0, :, 1]

在这里插入图片描述

  • 如果要反向选取第1层楼的最后一列的所有房间,使用如下代码:
arr[0, ::-1, -1]

在这里插入图片描述

  • 在该数组切片中间隔地选定元素:
arr[0, ::2, -1]

在这里插入图片描述

  • 如果在多维数组中执行翻转一维数组的命令,将在最前面的维度上翻转元素的顺序,在我们的例子中将把第1层楼和第2层楼的房间交换:
arr[::-1]

在这里插入图片描述

数组的维度改变

在上面我们已经学习怎样使用reshape函数来改变数组的形状,现在来学习一下怎样将数组展平

  • (一):ravel函数 、我们可以用ravel函数完成展平的操作:
arr.ravel()

在这里插入图片描述

  • (二):flatten函数、这个函数恰如其名,flatten就是展平的意思,与ravel函数的功能相同。 不过,flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图(view):
arr.flatten()

在这里插入图片描述

  • (3)用元组设置数组维度 除了可以使用reshape函数,我们也可以直接用一个正整数元组来设置数组的维度,如下所示:
arr.shape=(4,6)
arr

在这里插入图片描述

  • 正如你所看到的,这样的做法将直接改变所操作的数组,现在数组arr成了一个4×6的多维数组

  • (4) transpose在线性代数中,转置矩阵是很常见的操作。对于多维数组,我们也可以这样做:

arr.transpose()

在这里插入图片描述

  • (5) resizeresize和reshape函数的功能一样,但resize会直接修改所操作的数组:
arr.resize((2, 12))
arr

在这里插入图片描述

数组的组合

  • 首先创建两个3×3的二维数组
arr_one = np.arange(9).reshape((3,3))
arr_two = 2 * arr_one

在这里插入图片描述

  • (1) 水平组合 我们先从水平组合开始学习。将ndarray对象构成的元组作为参数,传给
    hstack函数。如下所示:
np.hstack((arr_one,arr_two))

在这里插入图片描述

  • 我们也可以用concatenate函数来实现同样的效果,如下所示:
np.concatenate((arr_one,arr_two),axis=1)

在这里插入图片描述
在这里插入图片描述

  • (2) 垂直组合 垂直组合同样需要构造一个元组作为参数,使用vstack函数。如下所示:
np.vstack((arr_one,arr_two))

在这里插入图片描述

  • 同样,我们将concatenate函数axis参数设置为0即可实现同样的效果。这也是axis参数的默认值:
np.concatenate((arr_one,arr_two),axis=0)

在这里插入图片描述
在这里插入图片描述

  • (3) 深度组合 将相同的元组作为参数传给dstack函数,即可完成数组的深度组合。所谓深度组合,就是将一系列数组沿着纵轴(深度)方向进行层叠组合。举个例子,有若干张二维平 面内的图像点阵数据,我们可以将这些图像数据沿纵轴方向层叠在一起,这就形象地解释了什么是深度组合
np.dstack((arr_one, arr_two))

在这里插入图片描述

  • (4) 列组合 column_stack函数对于一维数组将按列方向进行组合,如下所示:
np.column_stack((arr_one,arr_two))

在这里插入图片描述

  • 而对于二维数组,column_stack与hstack的效果是相同的:
    在这里插入图片描述
  • 我们可以用==运算符来比较两个NumPy数组是否完全相同!!
np.hstack((arr_one, arr_two)) == np.column_stack((arr_one, arr_two))

在这里插入图片描述

  • (5) 行组合 当然,NumPy中也有按行方向进行组合的函数,它就是row_stack函数。对于两个一维数组,将直接层叠起来组合成一个二维数组
  • 对于二维数组,row_stack与vstack的效果是相同的:
np.vstack((arr_one, arr_two))
np.row_stack((arr_one, arr_two))

在这里插入图片描述

  • 使用 ==运算符 对比两个数组
np.row_stack((arr_one, arr_two)) == np.vstack((arr_one, arr_two))

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值