大数据-Python数据分析2(numpy模块)
目录
前言
创建矩阵(使用 ndarray 对象)
获取矩阵的行数和列数(二维)
截取矩阵
按行列截取
条件拦截
矩阵组合
通过函数创建矩阵
排列
linspace
日志空间
个,零,眼,空
来自字符串
fromfunction
矩阵运算
常用矩阵运算符
常用矩阵函数
矩阵乘法(点乘法)
矩阵的转置
矩阵的逆 a_1
矩阵信息获取(如均值)
最大值和最小值
平均值
方差
标准差
中位数
求和
累计和
前言
NumPy(Numerical Python)是Python语言的扩展,支持大量维数组和矩阵运算,以及大量用于数组运算的数学函数库。
创建矩阵(使用ndarray对象)
对于python中的numpy模块,通常使用它们提供的ndarray对象。通过将列表作为参数来创建 ndarray 对象很容易。例如:
import numpy as np #Introducing numpy 库
#创建一维数组对象
a u003d np.array([1,2,3,4,5])
#创建二维数组对象
a2 u003d np.array([[1,2,3,4,5],[6,7,8,9,10]])
#用它们的类比创建多维对象
获取矩阵的行数和列数(二维)
定制为用matlab编程,在遍历矩阵时,一般会先得到矩阵的行数和列数。要获取 narray 对象的每个维度的长度,可以使用 narray 对象的 shape 属性
将 numpy 导入为 np
a u003d np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a.shape) #结果返回一个元组 tuple (2L, 5L)
print(a.shape[0]) #获取行数,返回2
print(a.shape[1]) #获取列数,返回5
截取矩阵
按行列截取
矩阵截取和list一样,可以用[](方括号)截取
将 numpy 导入为 np
a u003d np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a[0:1]) #截取第一行并返回[[1 2 3 4 5]]
print(a[1,2:5]) #截取第二行第三第四列,返回到[8 9]
print(a[1,:]) #截取第二行返回[67 8 9 10]
条件拦截
条件拦截实际上是一个布尔语句,它本身在 [] (方括号)中传递
将 numpy 导入为 np
a u003d np.array([[1,2,3,4,5],[6,7,8,9,10]])
b u003d a[a>6] # 截取矩阵a中大于6的元素,范围为一维数组
print(b) # 返回 [7 8 9 10]
实际上,布尔语句首先生成一个布尔矩阵,通过在[](方括号)中传递它进行截断
打印(a>6)
"""
返回
[[假假假假]
[假真真真真假]]
"""
条件截取常用于将矩阵中满足一定条件的元素转换为特定值。例如,矩阵中大于 6 的元素被转换为 0
将 numpy 导入为 np
a u003d np.array([[1,2,3,4,5],[6,7,8,9,10]])
打印(一)
"""
起始矩阵是
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
"""
a[a % 2 u003du003d 0] u003d 0
打印(一)
"""
偶数归零后的矩阵为
[[1 0 3 0 5]
[0 7 0 9 0]]
"""
矩阵组合
矩阵的组合可以通过numpy中的hstack和vstack方法来实现
将 numpy 导入为 np
a1 u003d np.array([[1,2],[3,4]])
a2 u003d np.array([[5,6],[7,8]])
#!注意参数是作为列表或元组传入的
打印(np.hstack([a1,a2]))
"""
横向合并,返回如下结果
[[1 2 5 6]
[3 4 7 8]]
"""
打印(np.vstack((a1,a2)))
"""
垂直合并,返回如下结果
[[1 2]
[3 4]
[5 6]
[7 8]]
"""
矩阵的合并也可以使用 concatenatef 方法完成
np.concatenate( (a1,a2), axisu003d0 ) 等价于 np.vstack( (a1,a2) )
np.concatenate( (a1,a2), axisu003d1 ) 等价于 np.hstack( (a1,a2) )
按函数创建矩阵
numpy 模块带有创建 ndarray 对象的函数,这使得创建普通或常规矩阵变得容易。
范围
将 numpy 导入为 np
a u003d np.arange(10) # 默认从0到10(不包括10),步长为1
print(a) # 返回 [0 1 2 3 4 5 6 7 8 9]
a1 u003d np.arange(5,10) # 从 5 到 10(不包括 10),步长为 1
print(a1) # 返回到[5 6 7 8 9]
a2 u003d np.arange(5,20,2) # 从5到20(不包括20),步长为2
print(a2) # 返回 [5 7 9 11 13 15 17 19]
林空间
linspace() 与 matlab 的 linspace 类似,它创建指定数量的等间隔序列,并实际生成一个等差列。
将 numpy 导入为 np
linspace(start, stop, numu003d50, endpointu003dTrue, retstepu003dFalse, dtypeu003dNone, axisu003d0)
"""
开始:数组_like
序列的起始值。
停止:数组_like
序列的结束值,除非 `endpoint`设置为 False。
在这种情况下,序列由 ``num + 1``的最后一个组成
均匀分布的样本,因此 `stop`被排除在外。注意步骤
当 `endpoint`为 False 时,大小会发生变化。
num : int,可选
要生成的样本数。默认值为 50。必须为非负数。
端点:布尔值,可选
如果为真,`stop`是最后一个样本。否则,不包括在内。
默认为真。
retstep : bool,可选
如果为 True,则返回 (`samples`, `step`),其中 `step`是间距
样本之间。
dtype:dtype,可选
输出数组的类型。如果没有给出`dtype`,则推断数据
从其他输入参数中键入。
"""
a u003d np.linspace(0,10,5) # 生成从 0 到 10 的 7 个数字的等差列
打印(一)
结果 [0.2.5 5 5.7.5 10.]
a u003d np.linspace(0, 10, 5, restepu003dTrue)
结果(数组 ([0., 2.5, 5., 7.5, 10.]), 2.5)
-
开始:起始值
-
停止:结束值
-
num:要生成的数量,不写默认为50
-
端点:默认为True,表示停止,False表示不停止
-
restep:默认为False,如果设置为True,返回等差列和步长的元组
-
dtype:指定数据类型,默认从输入参数推断
日志空间
linspace用于生成等差列,logspace用于生成对数等比列
将 numpy 导入为 np
logspace(start, stop, numu003d50, endpointu003dTrue, baseu003d10.0, dtypeu003dNone, axisu003d0):
"""
返回在对数刻度上均匀分布的数字。
在线性空间中,序列从``base ** start``开始
(`base`的 `start`次方) 并以 ``base ** stop``结尾
(见下文 `endpoint`)。
.. 版本更改:: 1.16.0
现在支持非标量 `start`和 `stop`。
参数
开始:数组_like
``base ** start``是序列的起始值。
停止:数组_like
``base ** stop``是序列的最终值,除非`endpoint`
为假。在这种情况下,``num + 1``值在
日志空间中的间隔,除了最后一个(一系列
长度 `num`) 被返回。
num : 整数,可选
要生成的样本数。默认值为 50。
端点:布尔值,可选
如果为真,`stop`是最后一个样本。否则,不包括在内。
默认为真。
基础:浮动,可选
日志空间的基础。元素之间的步长
``ln(samples) / ln(base)``(或 ``log_base(samples)``)是一致的。
默认值为 10.0。
数据类型:数据类型
输出数组的类型。如果没有给出`dtype`,则推断数据
从其他输入参数中键入。
轴:int,可选
结果中用于存储样本的轴。仅在开始时相关
或 stop 类似于数组。默认情况下 (0),样本将沿着
在开头插入新轴。最后使用 -1 得到一个轴。
"""
a u003d np.logspace(0,2,5)
打印(一)
结果[1.3.16227766 10.31.6227766 100.]
-
开始:起始值
-
停止:结束值
-
num:元素个数,默认为50
-
端点:默认为True,表示停止,False表示不停止
-
Base:指定对数的底,默认为10
-
dtype:指定数据类型,默认从输入参数推断
-
轴:结果中的轴用于存储样本。仅当 start 或 stop 类似于数组时才相关。默认情况下 (0),样本将跟随在开头插入的新轴。使用 -1 获取轴的末端
将 numpy 导入为 np
a u003d np.logspace([0, 0], [2, 2], 5, 轴u003d-1)
b u003d np.logspace([0, 0], [2, 2], 5)
打印(一)
"""
[[ 1. 3.16227766 10. 31.6227766 100. ]
[ 1. 3.16227766 10. 31.6227766 100. ]]
"""
打印(b)
"""
[[ 1. 1. ]
[ 3.16227766 3.16227766]
[ 10. 10. ]
[ 31.6227766 31.6227766 ]
[100. 100.]]
"""
个,零,眼,空
one 创建全 1 矩阵 zeros 创建全 0 矩阵 eye 创建单位矩阵 empty 创建空矩阵(实际值)
将 numpy 导入为 np
a_ones u003d np.ones((3,4)) # 创建一个 3*4 Full 1 矩阵
打印(一个_ones)
"""
结果
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
"""
a_zeros u003d np.zeros((3,4)) # 创建一个3*4的全0矩阵
打印(a_zeros)
"""
结果
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
"""
a_eye u003d np.eye(3) # 创建一个三阶单位矩阵
打印(a_eye)
"""
结果
[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
"""
a_empty u003d np.empty((3,4)) # 创建一个3*4的空矩阵
打印(一个_empty)
"""
结果
[[ 1.78006111e-306 -3.13259416e-294 4.71524461e-309 1.94927842e+289]
[ 2.10230387e-309 5.42870216e+294 6.73606381e-310 3.82265219e-297]
[ i.24242356e-309 1.07034394e-296 2.1268797j+183 i.88703165j-315]]
"""
来自字符串
fromstring() 方法将字符串转换为 ndarray 对象,这在对字符串进行数字化以获得字符串的 ascii 序列时很有用
将 numpy 导入为 np
a u003d "abcdef"
b u003d np.fromstring(a,dtypeu003dnp.int8) # 因为一个字符是8,所以指定dtype为np.int8
print(b) # 返回 [97 98 99 100 101 102]
来自函数
fromfunction() 方法根据矩阵的行号和列号生成矩阵的元素。例如,创建一个矩阵,其中每个元素都是行号和列号的总和
将 numpy 导入为 np
定义函数(i,j):
返回 i+j
a u003d np.fromfunction(func,(5,6))
第一个参数为指定函数,第二个参数为列表或元组,表示矩阵的大小
打印(一)
"""
结果
[[ 0.1.2.3.4.5.]
[ 1. 2. 3. 4. 5. 6.]
[ 2. 3. 4. 5. 6. 7.]
[ 3. 4. 5. 6. 7. 8.]
[ 4. 5. 6. 7. 8. 9.]]
"""
矩阵运算
常用矩阵运算符
numpy 中的 ndarray 对象重载了许多运算符,这些运算符可用于对矩阵之间的对应元素执行操作。
操作员
解释
添加矩阵对应元素
-
矩阵对应元素的减法
*
矩阵对应元素的乘法
/
将矩阵的对应元素相除,如果都是整数则取商
%
矩阵对应元素相除后的余数
**
矩阵的每个元素都是 n 次方,例如**2:每个元素都是平方的
将 numpy 导入为 np
a1 u003d np.array([[4,5,6],[1,2,3]])
a2 u003d np.array([[6,5,4],[3,2,1]])
print(a1+a2) # 加法
"""
结果
[[10 10 10]
[ 4 4 4]]
"""
print(a1/a2) # 整数除法商
"""
结果
[[0 1 1]
[0 1 3]]
"""
print(a1%a2) # 除余数
"""
结果
[[4 0 2]
[1 0 0]]
"""
常用矩阵函数
同样,在 numpy 中定义了许多函数,可用于作用于矩阵中的每个元素。 numpy模块,import numpy as np,a默认是一个ndarray对象,导入到表中。
矩阵函数
解释
np.sin(a)
对矩阵 a 中的每个元素取正弦,sin(x)
np.cos(a)
矩阵 a 中每个元素的余弦,cos(x)
np.tan(a)
与矩阵 a 中的每个元素相切,tan(x)
np.face
取矩阵 a 中每个元素的反正弦,arcsin(x)
np.arccos(a)
取矩阵 a 中每个元素的反余弦,arccos(x)
np.arctan(a)
弧形 n(x)
np.exp(a)
对矩阵 a 中的每个元素取一个指数函数,例如
np.sqrt(a)
对矩阵 a x 中的每个元素求根
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
打印(np.sin(a))
"""
结果
[[ 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 ]]
"""
打印(np.face(a))
"""
结果
C:\Users\Administrator\Desktop\learn.py:6: RuntimeWarning: 在 arcsin 中遇到无效值
打印(np.face(a))
[[ 1.57079633 在]
[在中]]
"""
当矩阵中的元素不在定义的域内时,RuntimeWarning 会导致 nan(不是数字)
矩阵乘法(点乘法)
矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。
矩阵乘法的功能是点
将 numpy 导入为 np
a1 u003d np.array([[1,2,3],[4,5,6]]) # a1是一个2*3矩阵
a2 u003d np.array([[1,2],[3,4],[5,6]]) # a2是一个3*2矩阵
print(a1.shape[1]u003du003da2.shape[0]) # 真,满足矩阵乘法条件
打印(a1.dot(a2))
a1.dot(a2) 等价于 matlab 中的 a1*a2
而python中的a1*a2等价于matlab中的a1.*a2
"""
结果
[[22 28]
[49 64]]
"""
矩阵的转置
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
打印(a.转置())
"""
结果
[[1 4]
[2 5]
[3 6]]
"""
转置矩阵的更简单方法是 a.T.
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
打印(a.T)
"""
结果
[[1 4]
[2 5]
[3 6]]
"""
矩阵的逆a_1
要反转一个矩阵,需要先导入 numpy.linalg,然后使用 linalg 的 inv 函数进行反转。矩阵求逆要求矩阵的行数和列数相同
将 numpy 导入为 np
导入 numpy.linalg 作为 lg
a u003d np.array([[1,2,3],[4,5,6],[7,8,9]])
打印(lg.inv(a))
"""
结果
[[ -4.50359963j+15 p.00719925j+15 -4.50359963j+15]
[ p.00719925j+15 -1.80143985j+16p.00719925j+15]
[ -4.50359963j+15p.00719925j+15 -4.50359963j+15]]
"""
a u003d np.eye(3) # 三阶单位矩阵
print(lg.inv(a)) # 单位矩阵的逆是自己
"""
结果
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
"""
矩阵信息获取(如均值)
最大值和最小值
获取矩阵中元素的最大值和最小值的函数分别是max和min,用于获取整个矩阵、行或列的最大值和最小值。
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
print(a.max()) #获取整个矩阵的最大值 结果:6
print(a.min()) #结果:1
可以指定关键字参数axis来获取一行的最大(小)值或者一列的最大(小)值
#axisu003d0 行方向最大(小)值,即每一列的最大(小)值
#axisu003d1 列方向最大(小)值,即每一行的最大(小)值
例如
打印(a.max(轴 u003d 0))
结果是[45 6]
打印(a.max(轴 u003d 1))
结果是[3 6]
获取最大最小元素的位置,可以通过argmax函数获取
打印(a.argmax(轴 u003d 1))
结果是[2]
平均值
类似地,可以获得整个矩阵、行或列的平均值。
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
print(a.mean()) #结果为:3.5
同理,关键字axis参数可以让你指定取平均值的方向
print(a.mean(axisu003d0)) # 结果 [2.5 3.5 4.5]
print(a.mean(axisu003d1)) # 结果[2.5.]
方差
方差函数是var(),方差函数var()等价于函数mean(abs(x-x.mean())**2),其中x是一个矩阵
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
print(a.var()) # 结果 2.916666667
print(a.var(axisu003d0)) # 结果 [2.25 2.25 2.25]
print(a.var(axisu003d1)) # 结果[0.66666667 0.66666667]
标准差
标准差的函数是std()。 std() 等价于 sqrt (mean (abs (x-x.mean()**2)) 或 sqrt(x.var())
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
print(a.std()) # 结果 1.70782512766
print(a.std(axisu003d0)) # 结果 [1.5 1.5 1.5]
print(a.std(axisu003d1)) # 结果[0.81649658 0.81649658]
中位数
中位数是指序列按大小排序后的中间值,如果有偶数,则取中间两者的平均值。
比如序列[5,2,6,4,2],按大小顺序[2,2,4,5,6],中间是4,所以这个序列的中值为4.
或者序列[5,2,6,4,3,2],按大小顺序[2,2,3,4,5,6],因为有偶数,中间两个数是3,4,这个序列的中值为3.5。
中位数函数是median(),调用方法是numpy.median(x,[axis]),axis可以指定轴方向,默认axis u003d None,中位数为所有数字
将 numpy 导入为 np
x u003d np.array([[1,2,3],[4,5,6]])
print(np.median(x)) # 所有数字的中位数
结果 3.5
print(np.median(x,axisu003d0)) # 沿第一维的中位数
结果[2.5 3.5 4.5]
print(np.median(x,axisu003d1)) # 沿第二维的中位数
结果[2.5.]
求和
矩阵求和的函数是sum(),可以对行、列或者整个矩阵求和
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
print(a.sum()) # 对整个矩阵求和
结果 21
print(a.sum(axisu003d0)) # 求和行方向
结果[57 9]
print(a.sum(axisu003d1)) # 求和列方向
结果[6 15]
累计金额
一个位置的累积和是指该位置之前(包括)所有元素的总和。
例如一个序列[1,2,3,4,5],其累积和为[1,3,6,10,15],即第一个元素为1,第二个元素为1+2u003d3,...,第五个元素是1+2+3+4+5u003d15。
矩阵的累积求和函数是cumsum(),可以对行、列或整个矩阵求和
将 numpy 导入为 np
a u003d np.array([[1,2,3],[4,5,6]])
print(a.cumsum()) # 对整个矩阵求和
结果[1 3 6 10 15 21]
print(a.cumsum(axisu003d0)) # 行方向的累积和
"""
结果
[[1 2 3]
[5 7 9]]
"""
print(a.cumsum(axisu003d1)) # 列方向的累积和
"""
结果
[[ 1 3 6]
[ 4 9 15]]
"""
更多推荐
所有评论(0)