IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 第二课 Numpy -> 正文阅读

[Python知识库]第二课 Numpy

Numpy介绍与安装

为什么会有Numpy

在这里插入图片描述

Numpy是什么?

Numpy(Numerical Python)是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通用语。

Numpy特点

  • 提供高效多维数组
  • 提供了基于数组的便捷算术操作以及广播机制
  • 对数据进行快速的矩阵计算
  • 对硬盘中数组数据进行读写操作

Numpy安装直接

在dos命令行中pip install numpy 即可。

可参考官网:https://numpy.org/devdocs/user/quickstart.html

Numpy基本操作

创建N-维数组对象

生成数组最简单的方式就是使用array函数。array函数接收任意的序列型对象,生成一个新的包含传递数据的Numpy数组。

  • numpy.array(object)
import numpy as np
li = [1,2,3,4]
arr = np.array(li)
arr      
  • numpy.arange([start,] stop[, step,])
import numpy as np
arr = np.arange(1,5)
arr

注意

  • ndarray数组是一个通用的多维同类数据容器,意味着数组里面每一个元素均为相同类型。

数组的数据类型

Numpy数据类型

类型类型代码描述
int8,uint8i1,u1有符号和无符号的8数位整数
int16,uint16i2,u2有符号和无符号的16数位整数
int32,uint32i4,u4有符号和无符号的32数位整数
int4,uint4i8,u8有符号和无符号的64位数位整数
float16f2半精度浮点数
float32f4标准单精度浮点数
float64f8标准双精度浮点数
bool布尔值,存储True或False
string_SASCII字符类型,eg:‘S10’
unicode_UUnicode类型,eg:‘U10’

查看数组数据类型

  • arr.dtype # 查看数组的数据类型
import numpy as np
arr = np.arange(1,5)
arr.dtype  

注意

  • np.array()会自动推断生成数组的数据类型
    指定数组的数据类型
  • numpy.array(object,dtype=None)
    • 创建数组时通过dtype直接指定
import numpy as np
arr = np.array([1,2,3],dtype='f8')
arr
arr.dtype
  • arr.astype(dtype) # 修改数组数据类型
import numpy as np
arr = np.array([1,2,3])
arr = arr.astype(np.float32)
arr.dtype

数组形状

  • arr.ndim
    查看数组的维度,返回值为整数
  • arr.shape
    查看数组的,返回值为元组

N-维数组对象

一维
在这里插入图片描述
二维

在这里插入图片描述

import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
arr

三维

在这里插入图片描述

import numpy as np
arr = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr
arr.shape

重塑数组

一维转多维

  • arr.reshape(shape,order=“C”)
    • shape为数组重塑形状
    • order表示重塑方向
      • C顺序(行方向)重塑
      • F顺序(列方向)重塑
import numpy as np
arr = np.arange(6)
arr = arr.reshape(2,3)
arr

多维转一维

  • arr.flatten()
  • arr.ravel()
    数组转置与换轴
  • arr.transpose() # 转置
  • arr.T # 转置
  • arr.swapaxes() # 换轴

创建数组其他函数

函数名描述
array将输入数据转换为ndarray数组,自动推断数据类型,默认赋值所有输入数据
asarray将输入数据转换为ndarray数组,但输入数据已经是ndarray则不再复制
arangepython内建函数range的数组版,返回一个数组
zeros根据给定的形状和数据类型生成全0数组
ones根据给定形状和数据类型生成全1数组
empty根据给定性状和数据类型生成一个没有初始化的空数值
full根据给定形状和数据类型生成指定数值的数组

数组的拷贝

理解
在这里插入图片描述
不拷贝

在这里插入图片描述

import numpy as np

arr = np.arange(12)
arr2 = arr
arr is arr2     
arr2[1] = 20   
arr

浅拷贝

在这里插入图片描述

arr3 = arr.view()
arr3
arr3 is arr      

arr3[0] = 10
arr

深拷贝
在这里插入图片描述

arr4 = arr.copy()
arr4 is arr       

arr4[2] = 20     
arr

Numpy数组算术

数组之所以重要是因为它允许我们进行批量操作数据并且没有任何for循环。也被称为向量化。
数组与标量的算术操作
数组与标量的算术操作会把计算参数传递给数组的每一个元素。

import numpy as np
arr = np.arange(6).reshape(2,3)
arr+1

两个等尺寸数组的算术操作

两个等尺寸数组的算术操作实际上是逐元素操作。

arr = np.arange(1,7).reshape(2,3)
arr
arr+arr   
arr/arr  
arr-arr   

广播机制
广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
与列数相同并且只有1行的数组之间进行运算
在这里插入图片描述

  • 在其丢失的轴上进行,也就是0轴广播
    与行数相同并且只有1列的数组之间进行运算
    在这里插入图片描述
  • 在其长度为1轴上进行,此处也就是1轴广播
    注意
  • 维度完全不一致,则无法广播。

数组拼接

  • np.vstack() 垂直拼接

  • np.hstack() 水平拼接
    注意

  • 水平拼接需要对应行数一致,垂直拼接需要对应列数一致。

切片

一维索引与切片

同python中的内建数据类型list一致。
注意
- 索引默认从0开始
- 切片左闭右开
- 步长为整数
二维索引与切片

  • 二维数组递归方式获取
  • 二维数组逗号分隔获取(行,列)
    • 取单行 arr[x1,:]
    • 取连续行 arr[x1:x2,:]
    • 取分开行 arr[[x1,x2],:]
    • 取子矩阵 arr[x1:x2,y1:y2]
    • 取点 arr[[x1,x2],[y1,y2]]
      注意
  • 当有需要修改数组当中的值时,我们可以直接取值进行赋值。
  • 当数组与标量进行比较时,数组当中每个元素与标量进行比较,返回bool值。与此同时,该比较也可以作为索引,被称为布尔索引。比如arr[arr>20]

将条件逻辑作为数组操作

numpy.where()函数是三元表达式 x if condition else y 的向量化版本。

  • np.where(condition, [x, y]) # 当满足条件,执行x,否则执行y
arr = np.arange(16).reshape(4,4) 
arr1 = np.where(arr<10,0,10)
arr1

Numpy操作本地数据

写入本地数据

  • np.savetxt(fname)
    • fname 文件路径
    • dtype 数据类型
    • delimiter 分隔符
    • fmt=’%.18e’ 写入文件的格式,例如:%d,%.2f,%.18e
    • converters 对数据预处理。比如{0:func}第0列进行func函数预处理
    • header 指定为表头
scores = np.random.randint(0,100,size=(40,2))  # 期中与期末考试

np.savetxt("scores.csv",scores,delimiter=",",fmt="%d",header="期中,期末",comments="") 

读取本地数据

  • np.loadtxt(fname) # 加载文件
    • fname 文件路径
    • dtype 数据类型
    • delimiter 分隔符
    • skiprows 跳过行
    • comment 如果行的开头为 # 就会跳过该行
    • usecols 是指使用(0,2)两列
    • unpack 每一列当成一个向量输出,而不是合并在一起
    • converters 对数据预处理。比如{0:func}第0列进行func函数预处理
np.loadtxt("scores.csv",delimiter=",",skiprows=1)

练习:

  • 合并云南白药.xlsx与五粮液.xlsx的数据

NaN与inf

nan与inf介绍
nan:not a number 表示不是一个数字,属于浮点类。
inf:np.inf 表示正无穷,-np.inf表示负无穷,属于浮点类。
NaN特点

  • nan与inf都是float类型
c = np.nan
c
type(c)    # float

d = np.inf
d
type(d)    # float
  • 两个nan是不相等的
    • 该特性可以用来判断nan的个数
      • np.count_nonzero() 计算非零的个数
      • np.isnan() 判断数组元素是否是NaN,返回为bool值
np.nan == np.nan   # False
  • np.nan与任何数值计算都是nan
np.arange([2,np.nan,3])+100  # arry([102,nan,103])

也正因为,np.nan与任何值计算都是nan所以在运算时,会带来较大的误差。一般我们都会将其处理掉。

如何处理nan
直接删除缺失值所在行,但是当数据量较小时,这样处理会有影响整体的数据。更优雅的做法,是当求和时,将np.nan处理为0;当求均值时,将np.nan处理为非nan的均值。
练习

  • exam.csv 文件的数据读取,并且将成绩为空的值替换为非空数据的均值。
exam_data = np.loadtxt("exam.csv",skiprows=1,delimiter=",",dtype=np.str)
exam_data[exam_data == ""] = 0
exam_data = exam_data.astype(np.float)
exam_data[exam_data == 0] = np.nan
exam_data

# 因为成绩是一列一列的 所以循环取出每一列 
for exam_col in range(exam_data.shape[1]):
    exam_col = exam_data[:,exam_col]
    non_nan_data = exam_col[exam_col == exam_col]
    exam_col[exam_col!=exam_col] = non_nan_data.mean()

random模块

np.random为我们提供了许多获取随机数的函数。其实是python内置random模块进行的封装。
参考网址:https://numpy.org/doc/stable/reference/random/legacy.html#numpy.random.RandomState
np.random.seed
用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。一般没有特殊要求不用设置。以下代码:

np.random.seed(1)
print(np.random.rand()) 

np.random.rand
生成一个值为[0,1)之间的数组,形状由参数指定,如果没有参数,那么将返回一个随机值。示例代码如下

data = np.random.rand() #生成一个0-1之间的随机数

np.random.randn
生成均值(μ)为0,标准差(σ)为1的标准正态分布的值。示例代码如下:

data = np.random.randn(2,3) #生成一个2行3列的数组,数组中的值都满足标准正太分布

np.random.randint
生成指定范围内的随机数,并且可以通过size参数指定维度。示例代码如下

data = np.random.randint(10,size=(3,5)) #生成值在0-10之间,3行5列的数组

np.random.choice
从一个列表或者数组中,随机进行采样。或者是从指定的区间中进行采样,采样个数可以通过参数指定

data = np.arange(100)
res = np.random.choice(data,size=(2,3)) #从data中随机采样,生成2行3列的数组

np.random.shuffle
把原来数组的元素的位置打乱。

a = np.arange(10)
np.random.shuffle(a) #将a的元素的位置都会进行随机更换

常用函数

聚合函数

方法描述
sum沿着轴向计算所有元素的累和,0长度数组,累和为0
mean数学平均,0长度的数组平均值为NaN
max,min最大值和最小值
argmax,argmin最大值和最小值的位置
std,var标准差和方差
ptp极值
sumsum从0开始元素累积和
median中值
a1 = np.arange(12).reshape(3,4)

np.sum(a1)         # 全部相加
np.sum(a1,axis=0)  # 计算0轴的累和
np.sum(a1,axis=1)  # 计算1轴方向的累和

一元函数

函数描述
np.abs绝对值
np.sqrt开根
np.square平方
np.exp计算指数(e^x)
np.log,np.log10,np.log2,np.log1p求以e为底,以10为低,以2为低,以(1+x)为底的对数
np.ceil向上取整,比如5.1会变成6,-6.9会变成-6
np.floor向下取整,比如5.9会变成5,-6.1会变成-7
np.rint,np.round四舍六入五成偶
np.modf将整数和小数分隔开来形成两个数组
np.isnan判断是否是nan
np.isinf判断是否是inf
np.cos,np.cosh,np.sin,np.sinh,np.tan,np.tanh三角函数
# 有正数 也有 负数
arr = np.random.uniform(-10,10,size=(3,5))  
arr

# 求绝对值
np.abs(arr)

np.rint(4.4)   # 四舍
np.rint(4.5)   # 五舍    

np.rint(4.6)   # 六入
np.rint(5.5)   # 五成双

二元函数

函数描述
np.add加法运算(即1+1=2),相当于+
np.subtract减法运算(即3-2=1),相当于-
np.negative负数运算(即-2),相当于加个负号
np.multiplynp.multiply 乘法运算(即23=6),相当于
np.divide除法运算(即3/2=1.5),相当于/
np.floor_divide取整运算,相当于//
np.modnp.mod 取余运算,相当于%
greater,greater_equal,less,less_equal,equal,not_equal>,>=,<,<=,=,!=的函数表达式
logical_andlogical_and &的函数表达式
logical_orlogical_or \
np.add(arr,arr)  # 加法运算

arr[np.logical_and(arr>0,arr<5)]  # 取出arr中 >0 并且 <5 的数

数组的线性代数运算

线性代数(例如矩阵乘法、矩阵分解、行列式以及其他数学函数)是任何数据分析库的重要组成部分。Numpy也提供这样的能力,那么如何进行线性代数的乘法呢?

我们直接使用 np.dot(arr,arr.T) 进行运算即可。
除此之外, numpy.linalg 中封装了一组标准的矩阵分解运算以及诸如逆运算、行列式等功能。

函数描述
detdet 计算矩阵行列式
eig计算方阵的本征值和本征向量
inv计算方阵的逆
qr计算QR分解
svd计算奇异值分解(SVD)
solve解线性方程
lstsq计算Ax=b的最小二乘解

需求1:利用inv函数,求解矩阵的逆矩阵(注意:矩阵可变,首先必须是方阵)
需求2:

# 求解如下方程组的解:
# x-2y+z=0
# 2y-8z=8
# -4x+5y+9z=-9

作业

1. Numpy索引和切片作业

  1. 将np.arange(10)数组中的奇数全部都替换成-1。
    在这里插入图片描述

  2. 有一个4行4列的数组(比如:np.arange(16).reshape((4,4))),请将其中对角线的数取出来形成一个一维数组。提示(使用np.eye)。
    在这里插入图片描述

  3. 有一个4行4列的数组(比如:np.arange(16).reshape((4,4))),请取出其中(0,0),(1,2),(3,2)的点。
    在这里插入图片描述

  4. 有一个4行4列的数组(比如:np.arange(16).reshape((4,4))),请取出其中第2-3行(包括第3行)的所有数据。
    在这里插入图片描述

  5. 有一个8行9列的数组(比如:np.arange(72).reshape((8,9))),请将其中第1-5行(包含第5行)的第8列大于3的数全部都取出来。
    在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 16:14:00  更:2021-07-25 16:14:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 15:58:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码