python数据分析-NumPy学习(下)

简介: python数据分析-NumPy学习

7.数组运算


a.数组运算的通用函数

函数 说明
numpy.sqrt(array) 平方根函数
numpy.exp(array) e^array[i]的数组
numpy.abs/fabs(array) 计算绝对值
numpy.square(array) 计算各元素的平方 等于array**2
numpy.log/log10/log2(array) 计算各元素的各种对数
numpy.sign(array) 计算各元素正负号
numpy.isnan(array) 计算各元素是否为NaN
numpy.isinf(array) 计算各元素是否为无穷大
numpy.cos/cosh/sin/sinh/tan/tanh(array) 三角函数
numpy.modf(array) 将array中值得整数和小数分离,作两个数组返回
numpy.ceil(array) 向上取整,也就是取比这个数大的整数
numpy.floor(array) 向下取整,也就是取比这个数小的整数
numpy.rint(array) 四舍五入
numpy.trunc(array) 向0取整
numpy.add(array1,array2) 元素级加法
numpy.subtract(array1,array2) 元素级减法
numpy.multiply(array1,array2) 元素级乘法
numpy.divide(array1,array2) 元素级除法 array1./array2
numpy.power(array1,array2) 元素级指数 array1.^array2
numpy.maximum/minimum(array1,aray2) 元素级最大值、最小值
numpy.fmax/fmin(array1,array2) 元素级最大值,最小值(忽略NaN)
numpy.mod(array1,array2) 元素级求模
numpy.mod(array1,array2) 元素级求模
numpy.copysign(array1,array2) 将第二个数组中值得符号复制给第一个数组中值


b.广播机制

1670743859826.jpg

1670743866884.jpg

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。


当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制:

import numpy as np 
a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([1,2,3])
a + b


广播的规则:


让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。

输出数组的形状是输入数组形状的各个维度上的最大值。

如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。

当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。


b.数组的算数运算

1670743885438.jpg

数组和数的运算


numpy的广播机制在运算过程中,加减乘除的值被广播到所有的元素上。

t1 = np.arange(24).reshape(6,4) 
t1+2 
t1*2
t1/2
t1-2


数组与数组的运算


同种形状的数组(对应位置进行计算操作)


如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数(ndim)相同,且各维度的长度(shape)相同。

t1 = np.arange(24).reshape((6,4)) 
t2 = np.arange(100,124).reshape((6,4)) 
t1+t2
t1*t2
t1-t2
t1/t2


不种形状的多维数组计算

# 行数不同,列数相同,不能进行算术运算
t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(18).reshape((3,6)) 
t1
t2 
t1-t2
# 提示什么错误?
# ValueError: operands could not be broadcast together with shapes (4,6) (3,6)
# 行数相同,列数不同,可以进行运算
t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(4).reshape((4,1)) 
t1-t2


行数或者列数相同的一维数组和多维数组可以进行计算:


列形状相同(会与每一个相同维度的数组的对应位相操作)

t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(0,6) 
t1-t2


行形状相同(会与每一个相同维度的数组的对应位相操作)


行数相同时数组为二维数组


数组上的算术运算符适用于elementwise(对应位置元素逐个相乘)

import numpy
a = np.array([20,30,40,50])
b = np.arange(4)
# 算术运算
c = a - b
c #?
b ** 2 #?
10 * np.sin(a) #?


增强运算

1670743950841.jpg

某些操作(例如+=和)*=就位以修改现有数组,而不是创建一个新数组

rg = np.random.default_rng(1)
a = np.ones((2,3),dtype=int)
b = rg.random((2,3))
a*3
a #?
b += a
b #?
a += b


也可以看看,其他有关数学运算的函数:

all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, invert, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where


c.矩阵运算

1670743983043.jpg

与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行操作。可以使用@运算符(在python> = 3.5中)或dot函数或方法执行矩阵乘积:

a = np.array([[1,1],[0,1]])
   b = np.array([[2,0],[3,4]])
   a * b #?
   a @ b #?
   a.dot(b) #?


d.数学函数

1670744004081.jpg

通用功能:NumPy提供了熟悉的数学函数,例如sin,cos和exp。在NumPy中,这些被称为“通用函数”(ufunc)。在NumPy中,这些函数在数组上逐个元素操作,生成数组作为输出。

b = np.arange(3)
np.exp(b)
np.sqrt(b)
c = np.array([2.,-1.,1.41421356])
np.add(b,c) #?


e.统计函数

1670744025941.jpg

函数 说明
np.sum() 计算数组的和
np.mean() 返回数组中元素的算术平均值
np.average() 根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值
np.std() 计算数组标准差
np.var() 计算数组方差
np.min() 计算数组中的元素沿指定轴的最小值
np.max() 计算数组中的元素沿指定轴的最大值
np.argmin() 返回数组最小元素的索引
np.argmax() 返回数组最大元素的索引
np.cumsum() 计算所有元素的累计和
np.cumprod() 计算所有元素的累计积
np.ptp() 计算数组中元素最大值与最小值的差(最大值 - 最小值)
np.median() 计算数组中元素的中位数(中值)
import numpy as np 
score = np.array([[80,88],[82,81],[75,81]]) 
# 1. 获取所有数据最大值 
result = np.max(score) 
# 2. 获取某一个轴上的数据最大值 
result = np.max(score,axis=0) 
# 3. 获取最小值 
result = np.min(score)
# 4. 获取某一个轴上的数据最小值
result = np.min(score,axis=0) 
# 5. 数据的比较 
result = np.maximum([-2, -1, 0, 1, 2], 0) # 第一个参数中的每一个数与第二个参数比较返回大的
result = np.minimum([-2, -1, 0, 1, 2], 0) # 第一个参数中的每一个数与第二个参数比较返回小的
result = np.maximum([-2, -1, 0, 1, 2], [1,2,3,4,5]) # 接受的两个参数,也可以大小一致; 第二个参数只是一个单独的值时,其实是用到了维度的广播机制; 
# 6. 求平均值 
result = np.mean(score) # 获取所有数据的平均值 
result = np.mean(score,axis=0) # 获取某一行或者某一列的平均值
# 7. 返回给定axis上的累计和 
arr = np.array([[1,2,3], [4,5,6]]) 
arr
arr.cumsum(0) 
arr.cumsum(1)
# 8. argmin求最小值索引 
result = np.argmin(score,axis=0) 
result
# 9. 求每一列的标准差 
# 标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;
# 一个较小的标准差,代表这些数据较接近平均值反应出数据的波动稳定情况,越大表示波动越大,越不稳 定。
result = np.std(score,axis=0) 
result 
# 10. 极值 
# np.ptp(t,axis=None)就是最大值和最小值的差 
# 拓展:方差var, 协方差cov, 计算平均值 average, 计算中位数 median


numpy.argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引:

import numpy as np 
a = np.array([[30,40,70],[80,20,10],[50,90,60]])  
a
# 调用 argmax() 函数
np.argmax(a)
# 展开数组:
a.flatten()
# 沿轴 0 的最大值索引
maxindex = np.argmax(a, axis=0)  
maxindex
# 沿轴 1 的最大值索引: 
maxindex = np.argmax(a, axis=1)  
maxindex 
# 调用 argmin() 函数:
minindex = np.argmin(a)  
minindex
# 展开数组中的最小值: 
a.flatten()[minindex]
# 沿轴 0 的最小值索引: 
minindex = np.argmin(a, axis=0)  
minindex
# 沿轴 1 的最小值索引:
minindex = np.argmin(a, axis=1)  
minindex


f.字符串函数

1670744109601.jpg

对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作。


这些函数在字符数组类(numpy.char)中定义

函数 描述
add() 对两个数组的逐个字符串元素进行连接
multiply() 返回按元素多重连接后的字符串
center() 居中字符串
capitalize() 将字符串第一个字母转换为大写
title() 将字符串的每个单词的第一个字母转换为大写
lower() 数组元素转换为小写
upper() 数组元素转换为大写
split() 指定分隔符对字符串进行分割,并返回数组列表
splitlines() 返回元素中的行列表,以换行符分割
strip() 移除元素开头或者结尾处的特定字符
join() 通过指定分隔符来连接数组中的元素
replace() 使用新字符串替换字符串中的所有子字符串
decode() 数组元素依次调用str.decode
encode() 数组元素依次调用str.encode
numpy.char.add() # 函数依次对两个数组的元素进行字符串连接
numpy.char.multiply() # 函数执行多重连接
numpy.char.center() # 函数用于将字符串居中,并使用指定字符在左侧和右侧进行填充
numpy.char.capitalize() # 函数将字符串的第一个字母转换为大写
numpy.char.title() # 函数将字符串的每个单词的第一个字母转换为大写
numpy.char.lower() # 函数对数组的每个元素转换为小写。它对每个元素调用 str.lower
numpy.char.upper() # 函数对数组的每个元素转换为大写。它对每个元素调用 str.upper
numpy.char.split() # 通过指定分隔符对字符串进行分割,并返回数组。默认情况下,分隔符为空格
numpy.char.splitlines() # 函数以换行符作为分隔符来分割字符串,并返回数组
numpy.char.strip() # 函数用于移除开头或结尾处的特定字符
numpy.char.join() # 函数通过指定分隔符来连接数组中的元素或字符串
numpy.char.replace() # 函数使用新字符串替换字符串中的所有子字符串
numpy.char.encode() # 函数对数组中的每个元素调用 str.encode 函数。 默认编码是 utf-8,可以使用标准 Python 库中的编解码器
numpy.char.decode() # 函数对编码的元素进行 str.decode() 解码


g.排序函数

1670744205902.jpg

numpy.sort() 函数返回输入数组的排序副本

numpy.sort(a, axis, kind, order)
参数 说明
a 要排序的数组
axis 沿着它排序数组的轴
kind 默认为(快速排序)
order 如果数组包含字段,则是要排序的字段
import numpy as np  
a = np.array([[3,7],[9,1]])  
a
print ('调用 sort() 函数:')
np.sort(a)
np.sort(a, axis=0)
np.sort(a, axis=1)
# 在 sort 函数中排序字段 
dt = np.dtype([('name',  'S10'),('age',  int)]) 
a = np.array([("raju",21),("anil",25),("ravi",  17),  ("amar",27)], dtype = dt)  
a
np.sort(a, order='name')


h.条件筛选函数

1670744238943.jpg


g.文件读写

1670744250484.jpg

NumPy文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
参数 说明
fname 文件,字符串或产生器,可以是.gz或bz2压缩文件
dtype 数据类型,可选,默认为np.float
delimiter 分隔字符串,默认是任何空格,改为逗号
skiprows 跳过前x行,一般跳过第一行表头
usecols 读取指定的列,索引,元组类型
unpack 如果为True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认False


三、numpy-矩阵专题


矩阵是numpy.matrix类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算、求逆等。


1. 矩阵对象的创建


# 等价于:numpy.matrix(..., copy=False)

# 由该函数创建的矩阵对象与参数中的源容器一定共享数据,无法拥有独立的数据拷贝

numpy.mat(任何可被解释为矩阵的二维容器)


# 该函数可以接受字符串形式的矩阵描述:

# 数据项通过空格分隔,数据行通过分号分隔。例如:'1 2 3; 4 5 6'

numpy.mat(拼块规则)


示例:创建matrix

# 创建matrix操作
import numpy as np
arr = np.arange(1, 10).reshape(3, 3)
arr
# 第一种方式
m = np.matrix(arr, copy=True)
m
m.shape
type(m)
# 第二种方式:共享方式
m2 = np.mat(arr)
m2
# 第三种方式
m3 = np.mat("1 2 3;4 5 6.0")
m3


2. 矩阵的乘法运算


# 矩阵乘法
import numpy as np
arr = np.array([[1, 1, 1],
                [2, 2, 2],
                [3, 3, 3]])
# 数组相乘, 各对应位置元素相乘
arr * arr
# 矩阵相乘,第n行乘m列之和,作为结果的n, m个元素
# 矩阵相乘,第一个矩阵列数必须等于第二个矩阵行数
m = np.mat(arr)
m * m


3. 矩阵的逆矩阵


若两个矩阵A、B满足:AB = E (E为单位矩阵),则称B为A的逆矩阵。


单位矩阵


在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此以外全都为0,记为

1670744411283.png

通常用I或E来表示。根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身,而且单位矩阵因此独特性有广泛用途。以下是一个单位矩阵示例:

image.png


逆矩阵示例:

e = np.mat("1 2 6; 3 5 7; 4 8 9")
print(e.I)
print(e * e.I)


注意:在计算过程中,可能出现如下错误,说明该矩阵不可逆。

numpy.linalg.LinAlgError: Singular matrix


4. ndarray提供的矩阵API


ndarray提供了方法让多维数组替代矩阵的运算:

a = np.array([
    [1, 2, 6],
    [3, 5, 7],
    [4, 8, 9]])
# 点乘法求ndarray的点乘结果,与矩阵的乘法运算结果相同
k = a.dot(a)
k
# linalg模块中的inv方法可以求取a的逆矩阵
l = np.linalg.inv(a)
l


5. 矩阵应用


案例:解线性方程组


假设一帮孩子和家长出去旅游,去程坐的是bus,小孩票价为3元,家长票价为3.2元,共花了118.4;回程坐的是Train,小孩票价为3.5元,家长票价为3.6元,共花了135.2。分别求小孩和家长的人数。使用矩阵求解。表达成方程为:

image.png

表示成矩阵相乘:

image.png

import numpy as np
# 解方程
prices = np.mat('3 3.2; 3.5 3.6')
totals = np.mat('118.4; 135.2')
x = np.linalg.lstsq(prices, totals)[0]  # 求最小二乘解
x
x = np.linalg.solve(prices, totals)  # 求解线性方程的解
x
x = prices.I * totals  # 利用矩阵的逆进行求解
x


四、numpy-概率论专题


numpy提供了random模块生成服从特定统计规律的随机数序列


1.随机抽样(np.random)

函数 描述
np.random.randint() 返回随机整数,左闭右开区间 [low, high)
np.random.randn() 返回一个样本,具有标准正态分布
np.random.rand() 随机样本位于[0, 1)中
np.random.random_integers() 返回随机的整数,位于闭区间 [low, high]
np.random.random_sample() 返回随机的浮点数,在半开区间 [0.0, 1.0)
np.random.random() 返回随机的浮点数,在半开区间 [0.0, 1.0)
np.random.ranf() 返回随机的浮点数,在半开区间 [0.0, 1.0)
np.random.sample() 返回随机的浮点数,在半开区间 [0.0, 1.0)
np.random.choice() 生成一个随机样本
np.random.bytes() 返回随机字节


2.排列

函数 描述
np.random.shuffle(array) 随机打乱顺序
np.random.permutation(array) 返回一个随机排列


3.分布

函数 描述
binomial(n,p[,size]) 二项分布的样本
exponential([scale,size]) 指数分布
f((dfnum, dfden[, size])) F分布样本
geometric(p[, size]) 几何分布
hypergeometric(ngood, nbad, nsample[, size]) 超几何分布样本
multinomial(n, pvals[, size]) 多项分布
normal([loc, scale, size]) 正态(高斯)分布
pareto(a[, size]) 帕累托(Lomax)分布
poisson([lam, size]) 泊松分布
standard_normal([size]) 标准正态分布 (mean=0, stdev=1).
uniform([low, high, size]) 均匀分布


相关文章
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
417 2
|
6月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
553 1
|
6月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1115 1
|
6月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
344 0
|
6月前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
|
6月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
294 4
|
7月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
C语言 Python
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
361 2
|
存储 算法 API
Python学习五:函数、参数(必选、可选、可变)、变量、lambda表达式、内置函数总结、案例
这篇文章是关于Python函数、参数、变量、lambda表达式、内置函数的详细总结,包含了基础知识点和相关作业练习。
268 0

推荐镜像

更多
下一篇
开通oss服务