numpy模块\pandas模块\matplotlib模块
numpy模块
numpy库有两个作用:
- 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
- 计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似
创建矩阵
矩阵即numpy的ndarray对象,创建矩阵就是把一个列表传入np.array()方法。
import numpy as np
# 创建一维的ndarray对象
arr = np.array([1, 2, 3])
# 创建二维的ndarray对象
print(np.array([[1, 2, 3], [4, 5, 6]]))
# 创建三维的ndarray对象
print(np.array([[[ 2.10025514, 0.12015895, 0.61720311],
[ 0.30017032, -0.35224985, -1.1425182 ],
[-0.34934272, -0.20889423, 0.58662319]],
[[ 0.83898341, 0.93110208, 0.28558733],
[ 0.88514116, -0.75439794, 1.25286816],
[ 0.51292982, -0.29809284, 0.48851815]],
[[-0.07557171, 1.13162939, 1.51981682],
[ 2.18557541, -1.39649634, -1.44411381],
[-0.50446586, 0.16003707, 0.87616892]]]))
获取矩阵的行列数
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 获取矩阵的行和列构成的数组
print(arr.shape)
# 获取矩阵的行
print(arr.shape[0])
# 获取矩阵的列
print(arr.shape[1])
切割矩阵
切分矩阵类似于列表的切割,但是与列表的切割不同的是,矩阵的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 取所有元素
print(arr[:, :])
# 取第一行的所有元素
print(arr[:1, :])
print(arr[0,:])
print(arr[0, [0, 1, 2, 3]])
# 取第一列的所有元素
print(arr[:, :1])
print(arr[:,0])
print(arr[(0, 1, 2), 0])
# 取第一行第一列的元素
print(arr[0, 0])
# 取大于5的元素,返回一个数组
print(arr[arr > 5])
# 矩阵按运算符取元素的原理,即通过arr > 5生成一个布尔矩阵
print(arr > 5)
矩阵元素替换
矩阵元素的替换,类似于列表元素的替换,并且矩阵也是一个可变类型的数据,即如果对矩阵进行替换操作,会修改原矩阵的元素,所以下面我们用.copy()方法举例矩阵元素的替换。
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 取第一行的所有元素,并且让第一行的元素都为0
arr1 = arr.copy()
arr1[0, :] = 0
# 取所有大于5的元素,并且让大于5的元素为0
arr2 = arr.copy()
arr2[arr > 5] = 0
# 对矩阵清零
arr3 = arr.copy()
arr3[:, :] = 0
矩阵的合并
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
# 合并两个矩阵的行,注意使用hstack()方法合并矩阵,矩阵应该有相同的行,其中hstack的h表示horizontal水平的
print(np.hstack((arr1, arr2)))
# 合并两个矩阵,其中axis=1表示合并两个矩阵的行
print(np.concatenate((arr1, arr2), axis=1))
# 合并两个矩阵的列,注意使用vstack()方法合并矩阵,矩阵应该有相同的列,其中vstack的v表示vertical垂直的
print(np.vstack((arr1, arr2)))
# 合并两个矩阵,其中axis=0表示合并两个矩阵的列
print(np.concatenate((arr1, arr2), axis=0))
通过函数穿件矩阵
arange
# 构造0-9的ndarray数组
print(np.arange(10))
# 构造1-4的ndarray数组
print(np.arange(1, 5))
# 构造1-19且步长为2的ndarray数组
print(np.arange(1, 20, 2))
linspace/logspace
# 构造一个等差数列,取头也取尾,从0取到20,取5个数
print(np.linspace(0, 20, 5))
# 构造一个等比数列,从10**0取到10**20,取5个数
print(np.logspace(0, 20, 5))
zeros/ones/eye/empty
np.zeros((3,4)) #创造一个3*4的全0矩阵
np.ones((3,4)) #狗仔一个3*4的全1矩阵
np.eye(3) #构造3个主元的单位矩阵
np.empty((4,4)) #构造一个4*4的随机矩阵,里面的元素是随机生成的
fromstring/fromfunction
# fromstring通过对字符串的字符编码所对应ASCII编码的位置,生成一个ndarray对象
s = 'abcdef'
# np.int8表示一个字符的字节数为8
print(np.fromstring(s, dtype=np.int8))
def func(i, j):
"""其中i为矩阵的行,j为矩阵的列"""
return i*j
# 使用函数对矩阵元素的行和列的索引做处理,得到当前元素的值,索引从0开始,并构造一个3*4的矩阵
print(np.fromfunction(func, (3, 4)))
矩阵的运算
# 运算符:+ - * / % **n
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
arr1+arr2 #两个元素对应位置元素相加
arr**2 #arr1中对应元素位置取平方
矩阵的点乘
矩阵的点乘必须满足第一个矩阵的列数等于第二个矩阵的行数
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
arr3=arr1.dot(arr2)
'''arr3是一个两行两列的矩阵,点乘就是把第一个矩阵的行乘以第二个元素的列,双方的元素一对一对应相乘并累加起来获得arr3对应的元素'''
#arr3[0,0]=arr1[0,0]*arr2[0,0]+arr1[1,0]*arr2[0,1]+arr1[2,0]*arr3[0,2]
矩阵的转置
矩阵的转置相当于矩阵的行和列互换
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.transpose())
print(arr.T)
矩阵的逆
矩阵行和列相同时,矩阵才可逆
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.linalg.inv(arr) #矩阵的逆
#单位矩阵的逆就是单位矩阵本身
arr1=np.eye(3)
np.linalg.inv(arr1)
矩阵的其他操作
最大值最小值
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr.max() #获取所有元素最大值
arr.min() #获取所有元素最小值
arr.max(axis=0) #获取矩阵每一列的最大值 输出一个行
arr.max(axis=1) #获取矩阵每一行的最大值 输出一个列
arr.argmax(axis=1) #获取矩阵最大元素的索引位置
平均值
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr.mean() #获取矩阵所有元素的平均值
arr,mean(axis=0) #获取矩阵每一列的平均值
arr.mean(axis=1) #获取矩阵每一行的平均值
pandas模块
pandas是python数据分析的核心模块,他主要提供了五大功能
- 支持文件存取操作,支持数据库,html,json,pickle,csv.sas.stata.hdf等
- 支持增删改查、切片、高阶函数、分组聚合等单标操作,以及和字典列表的互相转换
- 支持多表拼接合并操作
- 支持简单的绘图操作
- 支持简单的统计分析操作
Series
只能处理一维的数组
import numpy as np
import pandas as pd
arr = np.array([1,2,3,4,np.nan,])
s=pd.Series(arr)
'''添加索引并且一维数组中的元素类型都变成float'''