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天前
|
机器学习/深度学习 数据挖掘 计算机视觉
python数据分析工具SciPy
【4月更文挑战第15天】SciPy是Python的开源库,用于数学、科学和工程计算,基于NumPy扩展了优化、线性代数、积分、插值、特殊函数、信号处理、图像处理和常微分方程求解等功能。它包含优化、线性代数、积分、信号和图像处理等多个模块。通过SciPy,可以方便地执行各种科学计算任务。例如,计算高斯分布的PDF,需要结合NumPy使用。要安装SciPy,可以使用`pip install scipy`命令。这个库极大地丰富了Python在科学计算领域的应用。
11 1
|
7天前
|
数据可视化 数据挖掘 Python
Python中数据分析工具Matplotlib
【4月更文挑战第14天】Matplotlib是Python的数据可视化库,能生成多种图表,如折线图、柱状图等。以下是一个绘制简单折线图的代码示例: ```python import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] plt.figure() plt.plot(x, y) plt.title('简单折线图') plt.xlabel('X轴') plt.ylabel('Y轴') plt.show() ```
12 1
|
7天前
|
数据采集 SQL 数据可视化
Python数据分析工具Pandas
【4月更文挑战第14天】Pandas是Python的数据分析库,提供Series和DataFrame数据结构,用于高效处理标记数据。它支持从多种数据源加载数据,包括CSV、Excel和SQL。功能包括数据清洗(处理缺失值、异常值)、数据操作(切片、过滤、分组)、时间序列分析及与Matplotlib等库集成进行数据可视化。其高性能底层基于NumPy,适合大型数据集处理。通过加载数据、清洗、分析和可视化,Pandas简化了数据分析流程。广泛的学习资源使其成为数据分析初学者的理想选择。
13 1
|
7天前
|
数据采集 数据可视化 数据挖掘
NumPy在数据分析中的核心应用
【4月更文挑战第17天】NumPy是Python数据分析基础库,核心应用包括数据结构化、预处理、统计分析和可视化。它提供`ndarray`多维数组对象及灵活索引,用于数据存储和处理。数据预处理支持缺失值处理,统计分析涵盖描述性统计和相关性分析。虽不直接支持数据可视化,但能与Matplotlib等库集成绘制图表。掌握NumPy能提升数据分析效率,助于挖掘数据价值。
|
7天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
18 0
|
8天前
|
Python
用Python的Numpy求解线性方程组
用Python的Numpy求解线性方程组
10 0
|
8天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
49 0
|
9天前
|
Python 数据挖掘 存储
Python 数据分析(PYDA)第三版(七)(4)
Python 数据分析(PYDA)第三版(七)
33 1
|
Python Shell 存储
Python 数据分析(PYDA)第三版(七)(3)
Python 数据分析(PYDA)第三版(七)
44 1
Python 数据分析(PYDA)第三版(七)(3)
|
算法 数据挖掘 索引
Python刷题系列(1)_NumPy Basic(下)
NumPy是一个Python包,提供快速,灵活和富有表现力的数据结构,旨在使处理“关系”或“标记”数据既简单又直观。它旨在成为在Python中进行实际的现实世界数据分析的基本高级构建块。
Python刷题系列(1)_NumPy Basic(下)