学校开始的选修课复习笔记
*需要线性代数中矩阵的相关知识
1. NumPy的数组对象ndarray
(1).数组属性:ndarray是存储单一数据类型的多维数组
(2).构造方法
numpy.array(object,dtype=None, copy=True, order='K',subok=False,ndmin=0)
"""
#参数
object 接收array,表示想要创建的数组,无默认
dtype 接收data-type,表示数组所学的数据类型,若未给定则选择保存对象所需的最小类型,默认为None
ndmin 接收int,指定生成数组应具有的最小维度,默认为None
"""
例如:
import numpy as np #导入numpy库
arr1 = np.array([1,2,3,4]) #创建一维数组
print("创建的数组为:",arr1)
arr2 = np.array([1,2,3,4],[4,5,6,7],[7,8,9,10]) #创建二维数组
print("创建的数组为:\n",arr2)
print("数组维度为:",arr2.shape) #查看数组结构
# Output: 数组维度为:(3,4)
print("数据类型为:",arr2.dtype) #查看数组类型
#Output: 数据类型为:int32
print("数组元素个数为:",arr2.size) #查看数组元素个数
#Output: 数组元素个数为:12(不是3)
print("数组每个元素大小为:",arr2.itemsize) #查看数组元素的大小
#Output: 数组每个元素大小为:4
#重新设置数组的shape属性
arr2.shape = 4,3
print("重新设置shape的arr2:\n",arr2)
"""
Output: [[1,2,3]
[4,4,5]
[6,7,7]
[8,9,10]]
"""
(3).常用数组构造方法
#使用arrange函数创建数组
arr3 = np.arange(0,1,0.1) #arange(start,end,step) 算start不算end 注意是一个r !!
print(arr3)
#Output: [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9] #没有1
#使用linspace函数创建数组
arr4 = np.linspace(0,1,12) #linspace(start,end,num) start和end都包含 num为元素个数
print(arr4)
#Output: [0.,0.09090909, ...]
#arr4.dtype = float64
#arrange函数和linspace函数的区别
#1.arrange函数创建的数组步数为int,linspace函数创建的数组步数为float
#2.linspace用于创建等差数列,即使得到的元素为整数也会被保存为float64类型
#使用logspace函数创建等比数列
arr5 = np.logspace(0,9,10,base=2) #logspace(coef1,coef2,num,base)
#第一个数和第二个数输入的是base的几次方,num是次数
print(arr5)
#Output: [1.,2.,4.,8.,16.,32.,64.,128.,256.,512.]
#arr5.dtype = float64
#使用zeros函数创建数组
arr6 = np.zeros((2,3))
print(arr6)
"""
Output:
[0.,0.,0.]
[0.,0.,0.]
"""
#使用eye函数创建对角矩阵
arr7 = np.eye(3) #eye(N,M=None,k=0,dtype=<type 'float'>) 第一个参数是矩阵大小
#第二个参数等于0时输出对角矩阵,k为正整数时为上三角矩阵,k为负整数时为下三角矩阵
print(arr7)
"""
Output:
[[0.,1.,0.]
[0.,0.,1.]
[0.,0.,0.]]
"""
#使用diag函数创建/修改数组
arr8 = np.diag([1,2,3,4])
arr9 = [[1,2,3],[4,5,6],[7,8,9]]
arr10 = np.diag(arr9)
print(arr8)
print(arr10)
"""
Output:
[[1,0,0]
[0,2,0]
[0,0,3]]
[1,4,9]
"""
#当输入一维数组时,diag函数会返回一个以一维数组为对角线,其他元素为0的矩阵
#当输入二维数组时,diag函数会返回一个以二维数组对角线为元素的一维数组
#使用ones函数创建数组
arr11 = np.ones((2,3))
print(arr11)
"""
Output:
[[1,1,1]
[1,1,1]]
]
"""
(4).数据类型与类型转换
intx x为位数,可表达数为,范围为到例如int8,可表达的范围为,即256,范围为-128~127
类型转换:
print(np.float64(42))
#42.0
print(np.int64(42.0))
#42
#Python中 0为False 非0为True
print(np.bool(42))
#True
print(np.bool(0))
#False
print(np.float64(True))
#1.0
print(np.int64(False))
#0
(5).生成随机数
print(np.random.random(10))
#[0.15343184,0.51581585,...,0.92510545]
#random.random(x) 生成x个0~1之间的小数
print(np.random.rand((10,5))
#random.rand((a,b)) 生成服从均匀分布的(a,b)的矩阵 数字在0~1之间
print(np.random.randn(10,5))
#random.randn((a,b)) 生成服从正态分布的(a,b)的矩阵 数字在0~1之间
print(np.random.randint(2,10,size=[2,5]))
#random.randint(a,b,size)
#生成在[a,b)范围内的整数,size若为int类则为数量,若为数组则生成高维数组,缺省默认为1
random模块常用的函数
(6).访问数组
print(arr[5])
#通过下标访问数组
print(arr[3:5])
#对数组进行切片 包括前不包括后
print(arr[:5])
#开头缺省默认为从0开始
print(arr[-1])
#-1为倒数1个元素
arr[3:5] = 100,101
#切片可以直接修改元素值
arr[1:7:2]
#第三个参数为步长
arr[7:1:-2]
#步数为负数时表示倒数 开始的下标必须大于结束下标
arr[7,3:5]
#对多维数组也可以使用切片
(7). 改变数组形态
arr = [1,2,3,4,5,6,7,8]
#arr.ndim == 1
arr.reshape(2,4)
#[[1,2,3,4],
# [5,6,7,8]]
#arr.ndim == 2
arr.ravel()
#[1,2,3,4,5,6,7,8] 展平数组
arr.flatten()
#[1,2,3,4,5,6,7,8] 展平数组 与ravel()函数相同
arr.flatten('F')
#[1,5,2,6,3,7,4,8] 纵向展平数组
np.hstack(arr1,arr2)
#数组横向组合
np.vstack(arr1,arr2)
#数组纵向组合
np.concatenate((arr1,arr2),axis = 1)
#数组横向组合
np.concatenate((arr1,arr2),axis = 0)
#数组纵向组合
np.hsplit(arr,2)
#数组横向切割
np.vsplit(arr,2)
#数组纵向切割
np.split(arr,2,axis=1)
#数组横向切割
np.split(arr,2,axis=0)
#数组纵向切割
2.NumPy矩阵与通用函数
(1).NumPy创建矩阵
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
np.bmat("arr1 arr2;arr1 arr2")
(2).矩阵的运算
matr1*3 #矩阵与数相乘
matr1±matr2 #矩阵相加减
matr1*matr2 #矩阵相乘
np.mutiply(matr1,matr2) #矩阵相乘
matr2 = matr1.T #返回自身转置
matr2 = matr1.H #返回自身的共轭转置
matr2 = matr1.I #返回自身的逆矩阵
matr2 = matr1.A #返回自身数据的二维数组的一个视图
(3).ufunc函数
全称通用函数(universal function),是一种能够对数组中所有元素进行操作的函数
a.四则运算:+ - * / **(幂) 两数组形状要相同
b.比较:>、<、==、>=、<=、!= 返回一个布尔数组,内容为每个元素比较结果
c.逻辑运算:np.any函数表示逻辑"or" np.all表示逻辑"and",结果返回布尔值
ufunc函数的广播机制(broadcasting):
只有形状相同的矩阵才能用ufunc函数,若形状不相同的矩阵用ufunc函数,则会:
a.所有输入数组都向shape最长的数组看齐,不足的补1
b.输出数组的shape是输入数组shape在各个轴上的最大值
c.输入数组某个轴和输出数组对应轴的长度相等或等于1则能够用于计算或比较,否则会出错
d.若某个轴的长度为1,沿着此轴运算时都用此轴上的第一组值
例如:
一维数组:
[0 0 0] [0 0 0] [1 2 3] [1 2 3]
[1 1 1] [1 1 1] [1 2 3] [2 3 4]
[2 2 2] + [1 2 3] --》[2 2 2] + [1 2 3] = [3 4 5]
[3 3 3] [3 3 3] [1 2 3] [4 5 6]
二维数组:
[0 0 0] [1] [0 0 0] [1 1 1] [1 1 1]
[1 1 1] [2] [1 1 1] [2 2 2] [3 3 3]
[2 2 2] + [3] -> [2 2 2] + [3 3 3] = [5 5 5]
[3 3 3] [4] [3 3 3] [4 4 4] [7 7 7]
3.利用NumPy进行统计分析
(1).I/O流
NumPy文件读写主要有二进制文件读写和文件列表形式的数据读写两种不同形式:
np.save("../tmp/save_arr",arr) #以二进制形式保存数据
np.load("../tmp/save_arr.npy") #从二进制的文件中读取数据
np.savez("../tmp/savez_arr",arr1,arr2) #savez函数可以将多个数组保存到一个文件中
#存储时可以省略扩展名,读取时不能省略扩展名(.npy)
np.savetxt("../tmp/arr.txt",arr,fmt="%d",delimiter=",")
#将数组写到某种分隔符隔开的文本文件
np.loadtxt("../tmp/arr/txt",delimiter=",")
#把文件加载到一个二维数组中
np.genfromtxt("../tmp/arr.txt",delimiter=",")
#genfromtxt函数面向的是结构化数组和缺失数据
(2).使用数组进行简单的统计分析
arr.sort() #给数组排序
arr.sort(axis = 0) #axis=1为沿横轴排序 axis = 0是为纵轴排序
arr.argsort() #返回重新排序值的下标
arr.lexsort((a,b,c)) #可以传多个数组 按照最后一个数组排序
arr.unique(a) #把a中出现多次的元素去除,并将剩余元素排序,并返回
arr.unique(a,return_index=True) #先返回索引 再返回数组
np.tile(arr,reps)
#将arr重复reps次返回新数组
np.repeat(arr,reps, axis=None)
#将arr中的元素重复reps次,axis=0表示按行重复,axis=1按列重复
#tile和repeat函数的区别在于tile是对数组进行重复操作,repeat是对数组元素进行重复操作
(3).常用统计函数
至此NumPy的基本功能已叙述完全,但仍有大部分内容没有叙述(NumPy可以单独出一本书),只是简单介绍了常用功能,在使用时有不明了的方法仍需要查阅书籍。