Numpy基础用法
Numpy 【Numerical Python】
是一个开源的Python
科学计算库,用于快速处理任意维度的数组。Numpy
支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy
比直接使用Python
要简洁的多。Numpy
使用ndarray
对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
import numpy as np
# 创建一个二维ndarray对象
score=np.array([[1,2,3],[4,5,6],[7,8,9]])
1. ndarray相对于list优势
Numpy
专门针对ndarray
的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python
中的嵌套列表,数组越大,Numpy
的优势就越明显。
这是因为**ndarray
中的所有元素的类型都是相同的,而Python
列表中的元素类型是任意的**,所以ndarray
在存储元素时内存可以连续,而python
原生list
就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy
的ndarray
不及Python
原生list
。但在科学计算中,Numpy
的ndarray
就可以省掉很多循环语句,代码使用方面比Python
原生list
简单的多。
Numpy
底层使用C
语言编写,内部解除了GIL
【全局解释器锁】,其对数组的操作速度不受Python
解释器的限制,所以,其效率远高于纯Python
代码。
2. ndarray的属性
属性名字 | 属性解释 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维度 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度【字节】 |
ndarray.dtype | 数组元素的类型 |
可以调用这些属性得知ndarray
的基本情况
3. 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 | 标准单精度浮点数 |
float64 | f8或d | 标准双精度浮点数 |
float128 | f16或g | 拓展精度浮点数 |
complex64 | c8,c16,c32 | 分别基于32 位,64 位,128 位浮点数的复数 |
complex128 | 👆 | |
complex256 | 👆 | |
bool | ? | 布尔值,存储True 或False |
object | o | Python object 类型 |
string_ | S | 修正的ASCII 字符串类型,例如生成一个长度为10 的字符串类型,使用S10 |
unicode_ | U | 修正的Unicode 类型,生成一个长度为10 的Unicode 类型,使用U10 |
import numpy as np
# 创建一个二维ndarray对象,指定元素类型为float32,dtype='f4'与之等价
score=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype=np.float32)
# 使用astype()方法可以显示转换类型,tobytes()改为字节型
score = score.astype(np.float64)
若不指定,整数默认int64
,小数默认float64
4. 生成ndarray的方法
numpy
库的导入语句在后续例子中省略
-
np.array(list)
:将输入数据(可以是列表、元组以及其他序列)转换为ndarray
,如不显式指明数据类型,将自动推断;默认复制所有的输入数据asarray(list)
:将输入转换为ndarray
,但如果输入已经是ndarray
则不再复制import numpy as np data = np.array([[1.5, -0.1, 3], [0, -3, 6.5]]) print(data)
-
np.arrage(start,stop,step)
:Python
内置函数range
的数组版,返回一个数组生成范围
[start,stop)
,步长为step
的ndarry
,start
默认为0
,step
默认为1
# 生成的数组a为:[1,3,5] a = np.arange(start=1, stop=6, step=2)
-
np.ones((shape),dtype)
:生成指定shape
的全1
数组,dtype
默认为float64
np.ones_like(arr)
:根据所给数组生成一个形状一样的全1
数组a = np.ones((2, 3), dtype='f4') print(a)
-
np.zeros((shape),dtype)
:生成指定shape
的全0
数组,dtype
默认为float64
np.zeros_like(arr)
:根据所给数组生成一个形状一样的全0
数组使用方式如上
ones
方法👆 -
np.empty((shape),dtype)
:生成指定shape
的没有初始化值的空数组,dtype
默认为float64
np.empty_like(arr)
:根据所给数组生成一个形状一样的没有初始化值的空数组 -
np.full((shape), fill_value,dtype)
:生成指定shape
的值全为fill_value
的数组,dtype
默认为int64
np.ones_like(arr)
:根据所给数组生成一个形状一样的值全为fill_value
的数组a = np.full(shape=(2, 3), fill_value=5)
-
np.identity(n,dtype)
:生成n*n
的矩阵,对角线元素全1
,其余全0
,dtype
默认为float64
4.1 伪随机数生成
-
np.random.randint(low,high,(size))
:生成size
形状【size
为int
时一维】的数组,其值在[low,high)
之间# 生成3*3的矩阵,其值在[3,5)之间 score = np.random.randint(3, 5, (3, 3))
-
np.random.rand(shape)
:生成shape
形状的数组,值为[0,1)
内的一组均匀分布数,用法与正态分布的randn
类似👇 -
np.random.uniform(low=0.0,high=1.0,size=None)
:从一个均匀分布[low,high)
中随机采样,形状与size
中描述一致score = np.random.uniform(low=0.0, high=1.0, size=(3, 3))
-
np.random.randn(shape)
:生成shape
形状的数组,其值是标准正态分布随机数score = np.random.rand(3, 3)
-
np.random.normal(loc=0.0, scale=1.0, size=None)
:传入μ
和从而得到正态分布loc
:float
类型,正态分布的均值【 μ \mu μ,此值是正态分布峰值横坐标】scale
:float
类型,正态分布的标准差【σ,此值越大图形越胖,越小越高】size
:输出的shape
,默认为None
,只输出一个值
# 生成均值为1.75,标准差为1的正态分布数据,5个 score = np.random.normal(1.75, 1, 5)
numpy.random中其他伪随机数方法
函数 | 描述 |
---|---|
seed | 确定随机数生成器的种子 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围 |
shuffer | 对一个序列就地随机排列 |
binomial | 产生二项分布的样本值 |
beta | 产生Beta 分布的样本值 |
chisquare | 产生卡方分布的样本值 |
gamma | 产生Gamma 分布的样本值 |
5. ndarray形状修改
np.reshape(shape)/resize(new_shape)/T
reshape
返回一个具有相同数据域,但形状不一样的视图;resize
则是在原数组上进行修改;T
则是ndarray
的一个属性,表示转置后的ndarray
# 在转换形状的时候,一定要注意数组的元素匹配
arr = np.array([[1,2,3],[4,5,6]])
# 将arr由2行3列修改为3行2列
arr = arr.reshape([3,2])
# 将arr修改为3列,行数通过内部计算得到,目前待定
arr.reshape((-1,3))
6. ndarray进行数据筛选
6.1 逻辑运算
# 生成4行6列的矩阵,取值在[3,5)之间
arr = np.random.randint(3,5,[4,6])
# arr取行下标为2之后的行以及列下标为4【不包括】之前的列构成新数组arr1
# 逗号左边是行的取值情况,右边是列的取值情况,分别切片
arr1 = arr[2:,:4]
# arr1中大于3的赋为True,其余赋为False,得到一个新的布尔类型数组
bool_arr = arr1 > 3
# 将arr1中大于3的部分赋值为1
arr1 [ bool_arr ] = 1
6.2 通用判断函数
# 每行代表不同学生,每列代表不同科目
score = np.array([[70, 60, 81], [99, 97, 94], [30, 52, 79]])
# 判断前两名同学的成绩是否全及格,全部及格返回True
flag = np.all(score[:2, :] > 60)
# 判断前两名同学的成绩是否有大于80分的,有一个就返回True
np.any(score[:2, :] > 80)
6.3 三元运算符
# arr1中大于1的部分赋1,其余赋0
np.where(arr1 > 1, 1, 0)
# 复合逻辑需要结合np.logical_and和np.logical_or使用
# arr1中大于60且小于90的部分赋1,其余赋0
np.where(np.logical_and(arr1 > 60, arr1 < 90), 1, 0)
# arr1中大于60或者小于50的部分不变,其余赋0
np.where(np.logical_or(arr1 > 60, arr1 < 50), arr1, 0)
7. ndarray的运算
任何在两个等尺寸数组之间的算术操作都应用了逐元素操作的方式
a=np.array([[2,3],[4,5]])
b=np.array([[1,2],[3,4]])
# 对应元素相乘(除,加,减)
a *[/,+,-] b
# a矩阵每个元素取倒数
1 / a
# a矩阵每个元素的0.5次方
a ** 0.5
# 同形状数组比较,返回布尔数组
a > b
7.1 常用一元通用函数
通用函数
ufunc
是一种对ndarray
中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器一元通用函数指对一个
ndarray
操作的通用函数
函数 | 说明 |
---|---|
abs,fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs |
sqrt | 计算各元素的平方根(等价于arr ** 0.5 ) |
square | 计算各元素的平方,(等价于arr **2 ) |
exp | 计算各元素的自然指数值
e
x
e^x
ex ,其中x 是数组元素 |
log, log10, log2, log1p | 分别为底数为e , 底数为10 , 底数为2 ,底数为1+x 的log |
sign | 计算各元素的正负号:1 (正数),0 (零),-1 (负数) |
ceil | 计算大于等于该值的最小整数 |
floor | 计算小于等于该值的最大整数 |
rint | 将各元素值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数和整数部分以两个独立数组的形式返回【两个接收值】 |
isnan | 返回一个表示“哪些值是NaN ”的布尔型数组 |
isfinite,isinf | 分别返回一个表示“哪些元素是有穷的(非inf ,非NaN )”或“哪些元素是无穷的”的布尔型数组 |
cos,cosh,arccos | 普通型,双曲型三角函数和反三角函数【sin,tan 有类似用法】 |
logical_not | 计算各元素not x 的真值,相当于~arr |
7.2 常用二元通用函数
函数 | 说明 |
---|---|
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide,floor_divide | 除法或向下圆整除法【丢弃余数】 |
power | 对第一个数组中的元素A ,根据第二个数组中的相应元素B ,计算
A
B
A^B
AB |
maximum,fmax | 保留同一位置中的最大值,fmax 将忽略NaN 元素级的最小值计算【min 用法类似】 |
mod | 对第一个数组中的元素A ,根据第二个数组中的相应元素B ,计算A%B |
copysign | 将第二个数组中的值的符号复制给第一个数组中的值 |
greater,greater_equal less,less_equal equal,not_equal | 执行元素级的比较运算,最终产生布尔型数组 相当于运算符 >、>=、<、<=、==、!= |
logical_and logical_or logical_xor | 执行元素级的真值逻辑运算 相当于运算符`&、 |
7.3 常用统计函数
方法 | 说明 |
---|---|
sum | 对数组中全部或某轴向【axis 参数】的元素求和,零长度sum 为0 布尔值存储 True 强制为1 ,False 为0 ,因此可用于统计True 个数 |
mean | 算数平均数,零长度的数组的mean 为NaN |
std,var | 分别为标准差和方差,自由度可调(默认为n ) |
min,max | 最大值和最小值 |
argmin,argmax | 分别为最大和最小元素的索引 |
cumsum | 所有元素的累计和 |
cumprod | 所有元素的累计积 |
7.4 常用集合操作
方法 | 描述 |
---|---|
unique | 计算数组中的唯一元素,并返回有序结果【一维】 |
intersect1d | 计算x 和y 中的公共元素,并返回有序结果【一维】 |
union1d | 计算x 和y 的并集,并返回有序结果【一维】 |
in1d | 得到一个表示“x 的元素是否包含于y ”的布尔型数组 |
setdiff1d | 集合的差,即元素在x 中且不在y 中 |
setxor1d | 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素 |
7.5 线性代数
Numpy
的线性代数*
是矩阵逐元素乘积,而不是矩阵点乘积【点乘是@
】,T
属性是矩阵转置
7.5.1 numpy常用线代方法
方法 | 说明 |
---|---|
diag | 以一维数组的形式返回方阵的对角线元素,或将一维数组转换为方阵(非对角线元素为0 ) |
dot | 矩阵点乘【效果与@ 运算符一致】 |
trace | 计算对角线元素和【迹】 |
7.5.2 numpy.linalg常用方法
numpy.linalg
拥有一个矩阵分解的标准函数集以及其他常用函数,例如求逆和行列式求解等
方法 | 说明 |
---|---|
det | 计算矩阵行列之 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
pinv | 计算矩阵的Moore-Penrose 伪逆 |
qr | 计算QR 分解 |
svd | 计算奇异值分解【SVD 】 |
solve | 解线性方程组Ax = b ,其中A 为一个方阵 |
lstsq | 计算Ax = b 的最小二乘解 |