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


Numpy库基础

    • 一维数组的索引与切片
    • 多维数组的切片与索引
    • 数组的维度改变
    • 数组的组合

  • 上篇文章介绍了Numpy库的基础(数组,数组的创建,数据类型)需要回顾的可以查看:python数据分析基础之Numpy库详解(一)
一维数组的索引与切片
  • 一维数组的切片操作与Python列表的切片操作很相似。例如,我们可以用下标2~6来选取元素2,3,4,5
import numpy as np arr=np.arange(7) arr[2:6]

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

【数据分析基础|python数据分析基础之Numpy库详解(二)】数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

多维数组的切片与索引
  • ndarray支持在多维数组上的切片操作。为了方便起见,我们可以用一个省略号(…)来表示遍历剩下的维度
  • 如下举例:首先我们使用arange函数创建一个数组并改变其维度,使之变成一个三维数组:
arr = np.arange(24).reshape((2, 3, 4)) arr.shape

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

arr

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

  • 多维数组arr中有0~23的整数,共24个元素,是一个2×3×4的三维数组。我们可以形象地把它看做一个两层楼建筑,每层楼有12个房间,并排列成3行4列。或者,我们也可以将其看成是excel表格中工作表(sheet)、行和列的关系。可以看出,reshape函数的作用是改变数组的“形状”,也就是改变数组的维度,其参数为一个正整数元组,分别指定数组在每个维度上的大小
  • 如果指定的维度和数组的元素数目不相吻合,函数将抛出异常
  • 我们可以用三维坐标来选定任意一个房间,即楼层、行号和列号。例如,选定第1层楼、 第1行、第1列的房间(也可以说是第0层楼、第0行、第0列,这只是习惯问题),可以这样表示:
arr[0,0,0]

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

数组的维度改变 在上面我们已经学习怎样使用reshape函数来改变数组的形状,现在来学习一下怎样将数组展平
  • (一):ravel函数 、我们可以用ravel函数完成展平的操作:
arr.ravel()

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

  • 正如你所看到的,这样的做法将直接改变所操作的数组,现在数组arr成了一个4×6的多维数组
  • (4) transpose在线性代数中,转置矩阵是很常见的操作。对于多维数组,我们也可以这样做:
arr.transpose()

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

  • 而对于二维数组,column_stack与hstack的效果是相同的:
    数据分析基础|python数据分析基础之Numpy库详解(二)
    文章图片
  • 我们可以用==运算符来比较两个NumPy数组是否完全相同!!
np.hstack((arr_one, arr_two)) == np.column_stack((arr_one, arr_two))

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

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

数据分析基础|python数据分析基础之Numpy库详解(二)
文章图片

    推荐阅读