安装Numpy库
查看conda中已有的的环境名称conda info -e
或者conda info --env
或者conda env list
创建新环境conda create --name Exercise python=3.9
或者conda create -n Exercise python=3.9
环境的激活与切换conda activate Exercise
导入Numpyconda install -n Exercise Numpy
环境的删除conda remove -n Exercise --all
Numpy ndarray:多维数组对象
ndarray 是一个通用的多维同类型数据容器,它包含的每个元素均为相同类型。
1 | import numpy as np |
生成ndarray
使用array函数
1
2
3
4
5
6
7
8# 一维数组
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
print(arr1)
# 多维数组
data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
print(arr2)使用其他函数
函数名 描述 array 将输入数据(列表、元组、数组及其他序列)转换为ndarray asarray 将输入转换为ndarray,如果输入已经是ndarray则不再复制 arange 内建函数range的数据版本,返回一个数组 ones 根据给定形状和数据类型生成全1数组 ones_like 根据所给数组生成一个形状一样的全1数组 zeros 根据给定形状和数据类型生成全0数组 zeros_like 根据所给数组生成一个形状一样的全0数组 empty 根据给定形状生成一个没有初始化数值的空数组 empty_like 根据所给数组生成一个形状一样但没有初始化数值的空数组 full 根据给定形状和数据类型生成指定数值的数组 full_like 根据所给数组生成一个形状一样的指定数值的数组 eye, identity 生成一个N*N特征矩阵(对角线位置都是1,其余位置是0) 1
2
3print(np.zeros(10))
print(np.ones((3,6)))
print(empty((2,3,2)))
ndarray的数据类型
数据类型,即dtype,是一个特殊的对象,包含ndarray需要为某一种类型数值所申明的内存块信息(也称元数据,即表示数据的数据)
类型 | 类型代码 | 描述 |
---|---|---|
int8/uint8 | i1/u1 | 有符号/无符号的8数位整数 |
int16/uint16 | i2/u2 | 有符号/无符号的16数位整数 |
int32/uint32 | i4/u4 | 有符号/无符号的32数位整数 |
int64/uint64 | i8/u8 | 有符号/无符号的64数位整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4/f | 标准单精度浮点数;兼容C语言float |
float64 | f8/d | 标准双精度浮点数;兼容C语言double |
float128 | f16/g | 拓展精度浮点数 |
complex64 | c8 | 基于32位浮点数的复数 |
complex128 | c16 | 基于64位浮点数的复数 |
complex256 | c32 | 基于128位浮点数的复数 |
bool | ? | 布尔值,存储True或False |
object | O | Python object类型 |
string_ | S | 修正的ASCII字符串类型; |
unicode | U | 修正的Unicode类型; |
可以使用astype方法显示转换数组的数据类型:
1 | arr = np.array([1,2,3,4,5]) |
Numpy的数组算术
任何两个等尺寸数组之间的算术操作都应用了逐元素操作的方式(向量化)
不同尺寸的数组间的操作,会用到广播特性。
1 | import numpy as np |
索引与切片
简单来说,索引是指定数组中的某一个值或某一行/列值;切片可用于指定数组中多个值或某几行/列值
数组的切片索引
1 | import numpy as np |
布尔索引
布尔值数组的长度必须和数组轴索引长度一致,一般用原数组做逻辑判断后取出索引的值
1 | import numpy as np |
神奇索引
神奇索引是Numpy中的术语,用于描述使用整数数值进行数据索引。
1 | import numpy as np |
数组转置和换轴
转置是一种特殊的数据重组形式,可用于矩阵内积。
1 | import numpy as np |
数组的形状操作
数组的变形
reshape & resize
1
2
3
4
5
6
7
8
9
10
11
12import numpy as np
from numpy.core.fromnumeric import resize
# reshape是将数组转换成指定的形状,返回的结果对于原数组的形状是不会发生改变的
# resize将数组转换成指定的形状,会直接修改数组本身,并不会返回任何值
a1 = np.random.randint(1,10,size=(3,4))
a2 = a1.reshape((2,6))
print(a1)
print(a2)
a1.resize((2,6))
print(a1)flatten & ravel
1
2
3
4
5
6
7
8
9
10
11
12import numpy as np
# flatten是将数组转换为一维数组后,将这个拷贝返回回去,所以后续对这个返回值进行修改不会影响之前的数组
# ravel是将数组转换为一维数组后,将这个视图返回回去,所以后续对这个返回值进行修改会影响之前的数组
x = np.array([[1,2],[3,4]])
x.flatten()[1] = 100
print(x)
print(x.flatten())
x.ravel()[1] = 100
print(x)
print(x.ravel())
数组的叠加
1 | import numpy as np |
数组的切割
1 | import numpy as np |
通用函数:快速的逐元素数组函数
通用函数也称ufunc
,对某些标量计算结果进行向量化封装。
一元通用函数
函数名 | 描述 |
---|---|
abs/fabs | 逐元素计算整数/浮点数或复数的绝对值 |
sqrt | 计算每个元素的平方根(arr**0.5) |
square | 计算每个元素的平方(arr ** 2) |
exp | 计算每个元素的自然指数值e的x次方 |
log/log10/log2/log1p | 分别对应:自然对数(e为底)、10为底对数、2为底对数、log(1+x) |
sign | 计算每个元素的符号值:1=正数 0=0 -1=负数 |
ceil | 计算每个元素的最高整数值(即大于等于给定数值的最小整数) |
floor | 计算每个元素的最小整数值(即小于等于给定元素的最大整数) |
rint | 将元素保留到整数位,并保持dtype |
modf | 非别将数组的小数部分和整数部分按数组形式返回 |
isnan | 返回数组中的元素是否是一个NaN,返回值为布尔值数组 |
isfinite/isinf | 分别返回数组中的元素是否有限/无限,返回值为布尔值数组 |
cos/cosh/sin | 常规双曲三角函数 |
sinh/tan/tanh | 常规双曲三角函数 |
arcos/arccosh/arcsin | 反三角函数 |
arcsinh/arctan/arctanh | 反三角函数 |
logical_not | 对数组的元素按位取反(与~arr效果一致) |
二元通用函数
函数名 | 描述 |
---|---|
add | 数组对应元素相加 |
subtract | 在第二个数组中,将第一个数组中包含的元素去除 |
multiply | 将数组的对应元素相乘 |
divide/floor_divide | 除或整除 |
power | 将第二个数组的元素作为第一个数组对应元素的幂次方 |
maximum/fmax | 逐个元素计算最大值,fmax忽略NaN |
minimum/fmin | 逐个元素计算最小值,fmin忽略NaN |
mod | 按元素的求模计算(即求除法的余数) |
copysign | 将第一个数组的符号值改为第二个数组的符号值 |
greater/greater_equal/less | 进行逐个元素比较,返回布尔值数组(与数学操作符>/>=/<效果一致) |
less_equal/equal/not_equal | 进行逐个元素比较,返回布尔值数组(与数学操作符<=/==/!=效果一致) |
logical_and/logical_or/logical_xor | 进行逐个元素的逻辑操作(与逻辑操作符&/|/^效果一致) |
使用数组进行面向数组编程
利用数组表达式来替代显式循环的方法,成为向量化
,通常向量化的数组操作会比纯Python的等价实现在速度上快一到两个数量级(甚至更多)。
条件逻辑的数组操作
np.where
函数是三元表达式x if condition else y
的向量化版本
1 | import numpy as np |
数学和统计方法
方法 | 描述 |
---|---|
sum | 沿着轴向计算所有元素的累和 |
mean | 数学平均 |
std/var | 标准差/方差 |
min/max | 最小值/最大值 |
argmin/argmax | 最小值的位置/最大值的位置 |
cumsum | 从0开始元素累积和 |
cumprod | 从1开始元素累积积 |
布尔值数组的方法
1 | import numpy as np |
排序
1 | import numpy as np |
唯一值与其他集合逻辑
方法 | 描述 |
---|---|
unique(x) | 计算x的唯一值,并排序 |
intersect1d(x,y) | 计算x和y的交集,并排序 |
union1d(x,y) | 计算x和y的并集,并排序 |
in1d(x,y) | 计算x中的元素是否包含在y中,返回一个布尔值数组 |
setdiff1d(x,y) | 差集,在x中但不在y中的x的元素 |
setxor1d(x,y) | 异或集,在x或y中,但不属于x/y交集的元素 |
文件输入和输出
1 | import numpy as np |
线性代数
线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。需要注意的是,Numpy中的*
是矩阵的逐元素乘积,而不是矩阵的点乘积,点乘积需使用dot函数
函数 | 描述 |
---|---|
diag | 将一个方阵的对角元素作为一维数组返回 |
dot | 矩阵点乘积 |
trace | 计算对角元素和 |
det | 计算矩阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
pinv | 计算矩阵的Moore-Penrose伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 求解x的线性系数Ax=b,其中A是方阵 |
lstsq | 计算Ax=b的最小二乘解 |
伪随机数生成
np.random
模块可以高效地生成多种概率分布下的完整样本值数组。np.random
模块生成的随机数称为伪随机数
,它们是由具有确定行为的算法根据随机数生成器中的随机数种子生成的,可以通过np.random.seed
更改随机数种子。np.random
生成函数使用的是一个全局随机种子,为避免全局状态,可以使用np.random.RandomState
创建一个随机数生成器,使数据独立于其他随机数。
函数 | 描述 |
---|---|
seed | 向随机数生成器传递随机状态种子 |
permutation | 返回一个序列的随机排列,即乱序整数序列 |
shuffle | 随机排列一个序列 |
rand | 从均匀分布中抽取样本 |
randint | 根据给定的由低到高的范围抽取随机整数 |
randn | 从均值0,方差1的正太分布中抽取样本 |
binomial | 从二项分布中抽取样本 |
normal | 从正太(高斯)分布中抽取样本 |
beta | 从beta分布中抽取样本 |
chisquare | 从卡方分布中抽取样本 |
gamma | 从伽马分布中抽取样本 |
uniform | 从均匀[0,1)分布中抽取样本 |
补充知识点
方差
:各个数据与其算术平均数的离均差平方和再求平均数,用于表示数据的离散程度
标准差
:方差是数据的平方,与检测值本身相差太大,难以直观的衡量,所以常用方差开根号换算回来,这就是标准差。
累积和
:每个元素与之前元素的和,例如array([1,2,3,4,5])求累积和为array([1,3,6,10,15])
累积积
:每个元素与之前元素的积,例如array([1,2,3,4,5])求累积积为array([1,2,6,24,120])
特征值
:设 A 是n阶方阵,如果存在数m和非零n维列向量 x,使得 Ax=mx 成立,则称 m 是矩阵A的一个特征值
特征向量
:设 A 是n阶方阵,如果存在数m和非零n维列向量 x,使得 Ax=mx 成立,则称 x 是矩阵A的一个特征向量
行列式
:是由排成n阶方阵形式的n²个数aij(i,j=1,2,…,n)确定的一个数,其值为n!项之和
奇异矩阵
:若矩阵A相应的行列式D=0,称A为奇异矩阵,否则称为非奇异矩阵
温故而知新,可以为师也~