Numpy学习笔记

  • 时间:
  • 来源:互联网
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45949781/article/details/103338562

python的强大之处就是能够便捷地对数据进行操作、处理、清洗和可视化,从而对数据进行分析。在如今机器学习和人工智能兴起的时代,python进行数据处理和分析就显得更加重要了,是一门必不可少的技能之一。以前也一直接触过python,也用它处理过不少数据和东西,但都是零零碎碎地,不太扎实吧。因此,最近机缘巧合地有机会系统性地学习一下python处理数据的操作和方法,因此简单记录一下一些常用的函数和操作,方便以后查询,常用常查。

这一篇主要记录关于Numpy的学习心得笔记,之后一篇是关于Pandas处理表格化文件的操作和函数笔记,最后一篇是关于Matplotlib将数据可视化的技巧,有利于将来实验数据的可视化。

Numpy

Numpy库是python数值计算的核心组成部分,提供了多种数据结构、算法和大量数值计算的接口,能够快速进行高维数组对象的计算。安装Numpy库很简单,可以直接通过Anaconda或者pip安装。

一般,习惯性用下面这个命令导入Numpy库
import numpy as np

数据类型

下表列出了NumPy中定义的不同数据类型。

数据类型 描述
bool 存储为一个字节的布尔值(真或假)
int 默认整数,相当于 C 的long,通常为int32或int64
int8 1个字节(-128 ~ 127)
int16 16 位整数(-32768 ~ 32767)
int32 32 位整数(-2147483648 ~ 2147483647)
int64 64 位整数
uint8 8 位无符号整数(0 ~ 255)
uint16 16 位无符号整数(0 ~ 65535)
uint32 32 位无符号整数(0 ~ 4294967295)
uint64 64 位无符号整数
float32 单精度浮点:符号位,8 位指数,23 位尾数
float64 双精度浮点:符号位,11 位指数,52 位尾数
complex64 复数,由两个 32 位浮点表示(实部和虚部)
complex128 复数,由两个 64 位浮点表示(实部和虚部)
object Python对象类型
string 修正的ASCII字符串类型
unicode 修正的Unicode类型

Numpy还有一些预先定义的特殊值:

特殊值 描述
np.nan 缺失值
np.pi 圆周率 3.1415926…
np.e 自然数e 2.718281828459045…

我们可以直接定义数据的类型,例如
a = np.array([3,4,5],dtype=np.int)
也可以使用np.astype 显式地转换数据类型

>>> a = np.arange(1, 6)
>>> a.dtype
 dtype('int32')
>>> f_a = a.astype(np.float64)
>>>> f_a.dtype
 dtype('float64')

随机数生成

函数 描述
random 返回一个区间[0.0, 1.0)中的随机浮点数
seed 向随机数生成器传递随机状态种子
permutation 返回一个序列的随机排列,或者返回一个乱序的整数范围序列
shuffle 随机排列一个序列
rand 从均匀分布中抽取样本
randint 根据给定的由低到高的范围抽取随机整数
randn 从均值0,方差1的正态分布中抽取样本
binomial 从二项式分布中抽取样本
normal 从正态分布中抽取样本
beta 从beta分布中抽取样本
chisquare 从卡方分布中抽取样本
gamma 从伽马分布中抽取样本
uniform 从均匀[0,1)中抽取样本

创建数组和计算

创建数组的方式有很多种,比如使用array方法,并提供标准的Python列表或者元组作为参数。array函数会自动将二维或三维序列转换为对应的二维或三维数组。当然,我们在创建的时候,可以显式地指定数据的类型。

  >>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
  >>> c
   array([[ 1.+0.j,  2.+0.j],[ 3.+0.j,  4.+0.j]])

下面是一些创建数组时常用的函数:

函数 描述
np.zeros 创建一个都是0的数组
np.ones 创建一个都是1的数组
np.eyes(n) 创建n维度的单位矩阵
np.empty 创建一个初始内容是0或者垃圾值的数组
numpy.arange(start, stop, step, dtype) 返回一个有终点和起点的固定步长的排列
numpy.linspace(start, stop, num, endpoint, retstep, dtype) 指定在区间内均匀生成几个数,至于步长,系统会自动计算

通常来说,对数组做基本的算术运算,将会对整个数组的所有元组进行逐一运算,并将运算结果保存在一个新的数组内,而不会破坏原始的数组。下面是通用计算函数:

函数名 描述
星号* 矩阵元素相乘
np.dot(a,b) 或 a.dot(b) 矩阵相乘
np.argmin 返回矩阵中最小值的索引
np.argmax 返回矩阵中最大值的索引
np.mean()或array.mean 返回矩阵中平均值
np.average 返回矩阵中平均值,可以算加权算术平均值
np.median 求中位数
np.cumsum 累加矩阵
np.diff 沿着指定轴计算第N维的离散差值
np.sort 对数组或数组某一维度进行就地排序
np.abs 逐个元素进行绝对值计算
np.fabs 复数的绝对值计算
np.sqrt 平方根
np.square 平方
np.exp 自然指数函数
np.log e为底的对数
np.log10 10为底的对数
np.log2 2为底的对数
np.sign 计算每个元素的符号值
np.add 将数组的对应元素相加
np.subtract 在第二个数组中,将第一个数组中包含的元素去除
np.multiply 将数组的对应元素相乘
np.divide 相除
np.floor_divide 整除,放弃余数
np.power 幂函数
np.maxium 逐个元素计算最大值
np.minimum 逐个元素计算最小值
np.mod 按元素进行求模运算

改变形状

函数 描述
np.ravel() 平铺数组成为一维数组
np.reshape() 调整形状
array.T 返回array的转置数组
np.vstack((a,b)) 垂直方向的合并
np.hstack((a,b)) 水平方向的合并
np.concatenate((m,n),axis= ) 数组拼接(默认是 axis = 0,对0轴的数组对象进行纵向的拼接(横向的拼接沿着axis= 1方向)传入的数组必须满足在拼接方向axis轴上数组间的形状一致)
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b))  #vertical stack  垂直方向的合并
d = np.hstack((a,b)) #horizontal 水平方向的合并
1
2
3
4
[[1 1 1]
[2 2 2]]
[1 1 1 2 2 2]
a = np.array([[1, 2], [5, 7]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
1
2
3
[[1, 2],
[5, 7],
[5, 6]]

索引切片去重迭代

Numpy的切片操作,默认是修改原数组的,而不是原生Python那样,以复制为主。对于多维数组,每个轴都有一个索引index,并以逗号分隔。

>>> b=np.array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> b[2,3]      # 第3行第4列的元素,注意索引从0开始计数
23
>>> b[0:5, 1]        # 第二列中的每一行,注意区间的左闭合右开的特性
array([ 1, 11, 21, 31, 41])
>>> b[ : ,1]                        # 相当于上面的例子
array([ 1, 11, 21, 31, 41])
>>> b[1:3, : ]                      # 每一列的,第二行和第三行的元素
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])
>>> b[-1]   #当给与的参数少于轴数时,其它的轴被认为是全选,比如这里获得最后一行,等同于b[-1,:]
array([40, 41, 42, 43])

在上面的最后例子中,省略了列的索引。有时候,它们会被写作这样的格式x[i,…]。三个连续的圆点,代表其它未给出的所有轴的索引。例如假设有数组x,它有5个轴,那么:

x[1,2,...]相当于x[1,2,:,:,:]
x[...,3]相当于x[:,:,:,:,3]
x[4,...,5,:]相当于x[4,:,:,5,:]

对多维数组进行迭代,可以使用flat和flatten(将数组转换为1-D)
其中flat()返回一个迭代器,flatten()返回一个1-D序列

a = np.arange(3,15).reshape(3,4)
for item in a.flat:
    print(item)
print(a.flatten())
3
4
5
6
7
8
9
10
11
12
13
14
[ 3 4 5 6 7 8 9 10 11 12 13 14]

对于数组的添加删除去重操作是很简单的,其中

函数 描述
np.append 将值添加到数组末尾
np.insert 沿指定轴将值插入到指定下标之前
np.delete 返回删掉某个轴的子数组的新数组
np.unique 寻找数组内的唯一元素

分割

函数 描述
np.split(array,indices_or_sections,axis=0) 指定分隔符对字符串进行切片
np.hsplit(array,indices_or_sections,axis=0) 指定分隔符对字符串进行水平方向切片
np. vsplit(array,indices_or_sections) 指定分隔符对字符串进行垂直方向切片
np. dsplit(array,indices_or_sections) 对矩阵沿深度方向切片
np.array_split(array,indices_or_sections) 对矩阵进行不等分的切片

深拷贝

copy方法生成数组的一个完整的深度拷贝,包括其数据。

a = np.arange(12).reshape((3,4))
b = a.copy()
b[0][0] = 12
print(b)
[[12 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

布尔索引

使用布尔数组进行索引,其实就是我们显式地选择数组中需要哪些项,不需要哪些项。可以使用与原始数组形状相同的布尔数组进行筛选过滤。

>>> a = np.arange(12).reshape(3,4)
>>> b = a > 4
>>> b   # 通过比较运算,b变成了一个由布尔值组成的数组
array([[False, False, False, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True]])
>>> a[b]        # 生成一个由True值对应出来的一维数组
array([ 5,  6,  7,  8,  9, 10, 11])

[参考文档]
http://www.liujiangblog.com/course/data/201
https://blog.csdn.net/ggfujfdd/article/details/90738582

本文链接http://element-ui.cn/news/show-466.aspx