> 文章列表 > Numpy基础用法

Numpy基础用法

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就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpyndarray不及Python原生list。但在科学计算中,Numpyndarray就可以省掉很多循环语句,代码使用方面比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 ? 布尔值,存储TrueFalse
object o Python object类型
string_ S 修正的ASCII字符串类型,例如生成一个长度为10的字符串类型,使用S10
unicode_ U 修正的Unicode类型,生成一个长度为10Unicode类型,使用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)
    

    Numpy基础用法

  • np.arrage(start,stop,step)Python内置函数range的数组版,返回一个数组

    生成范围[start,stop),步长为stepndarrystart默认为0step默认为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)
    

    Numpy基础用法

  • 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)
    

    Numpy基础用法

  • np.identity(n,dtype):生成n*n的矩阵,对角线元素全1,其余全0dtype默认为float64

4.1 伪随机数生成

  • np.random.randint(low,high,(size)):生成size形状【sizeint时一维】的数组,其值在[low,high)之间

    # 生成3*3的矩阵,其值在[3,5)之间
    score = np.random.randint(3, 5, (3, 3))
    

    Numpy基础用法

  • 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))
    

    Numpy基础用法

  • np.random.randn(shape):生成shape形状的数组,其值是标准正态分布随机数

    score = np.random.rand(3, 3)
    

    Numpy基础用法

  • np.random.normal(loc=0.0, scale=1.0, size=None):传入μ和从而得到正态分布

    • locfloat类型,正态分布的均值【μ\\muμ,此值是正态分布峰值横坐标】
    • scalefloat类型,正态分布的标准差【σ,此值越大图形越胖,越小越高】
    • size:输出的shape,默认为None,只输出一个值
    # 生成均值为1.75,标准差为1的正态分布数据,5个
    score = np.random.normal(1.75, 1, 5)
    

    Numpy基础用法

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 计算各元素的自然指数值 exe^xex ,其中x是数组元素
log, log10, log2, log1p 分别为底数为e, 底数为10, 底数为2,底数为1+xlog
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,计算 ABA^BAB
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参数】的元素求和,零长度sum0
布尔值存储True强制为1False0,因此可用于统计True个数
mean 算数平均数,零长度的数组的meanNaN
std,var 分别为标准差和方差,自由度可调(默认为n
min,max 最大值和最小值
argmin,argmax 分别为最大和最小元素的索引
cumsum 所有元素的累计和
cumprod 所有元素的累计积

7.4 常用集合操作

方法 描述
unique 计算数组中的唯一元素,并返回有序结果【一维】
intersect1d 计算xy中的公共元素,并返回有序结果【一维】
union1d 计算xy的并集,并返回有序结果【一维】
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的最小二乘解

平阳教育网