Numpy:用于存储和处理大型矩阵,比python自身的嵌套列表结构要高校很多
anaconda:是一个开源的python发行版本,包括conda,python以及一大堆安装好的工具包
ipython 开发环境,解释器
jupyter notebook是编辑工具
anaconda包含了jupyter notebook编辑器和ipython编辑器,我们可以在jupyter notebook中使用ipython解释器编写代码
jupyter中的魔法命令
- 执行.py文件:%run .py文件的路径
- 运行计时,一般用于统计耗时较长代码的运行时长:%time statement
运行计时,一般用于统计耗时较短代码的运行时长:
%timeit statement
%timeit -r 运行次数 -n 循环次数 statement
用于耗时较短
%%timeit
statement1
statement2
statement3
用于耗时较长
%%time
statement1
statement2
statement3 - %who:查询当前会话的所有变量和函数名称
- %whos:查询当前会话的所有变量和函数名称的详细信息
- %who_ls: 返回一个字符串列表,列表中是当前会话的所有变量和函数名称
- lsmagic:查看魔法命令的文档
numpy数组的创建
ndarry是numpy中表示数组的重要形式
np.array()创建
I=[1,2,3,4,5]
type(I) # list
I = np.array(I)
type(I) # numpy.ndarray
I.shape #(5,)
注意:numpy默认ndarry的所有元素的类型是相同的
如果传进来的列表中包含不同的类型,则统一为同一类型:str>float>int
使用np的routines创建
np.ones(shape,dtype=None,order='C')
"""
创建一个所有元素都为1的多维数组
shape:形状
dtype=None:元素类型
order:{’C‘,'F'}可选,默认值:C是否在内存中以行主或列主(Fortran)顺序存储多维数据,一般默认即可
"""
np.ones(shape,dtype=None,order='C')
n = np.ones(shape=(3,4))
n = np.ones(shape=(3,4),dtype=np.int16)
np.zeros(shape,ddtype=float,order='C')
np.full(shape, fill_value,dtype=None, order='C')
"""
创建一个所有元素都为指定元素的多维数组
shape:形状
fill_value:填充值
dtype=None:元素类型
order:{’C‘,'F'}可选,默认值:C是否在内存中以行主或列主(Fortran)顺序存储多维数据,一般默认即可
"""
np.full(shape=(3,4),fill_value = 5,dtype=np.int16)
np.eye(N,M=None, k=0, dtype=float)
"""
创建一个对角线为1,其他位置为0的二维数组,
单位矩阵:主对角线为1,其他都为0
N:行数
M:列数,默认为None,表示和函数一样
k=0:主对角线向右偏移0个位置
dtype=None:元素类型
"""
np.eye(6)
np.eye(6,9,dtype=np.int8)
np.eye(6,9,k=2,dtype = np.int8)
等差数列
np.linspace(start,stop,num=50,endpoint = True, retstep=False, dtype = None)
'''
创建一个等差数列
start:开始值
stop:结束值
num=50: 等差数列中默认有50个数
endpoint=True:是否包含结束值
retstep=False:是否返回等差值(步长)
dtype=None: 元素类型
'''
np.linspace(0,100,num = 51)
np.linspace(0,100,num = 50,dtype = np.int16)
np.linspace(0,100,num = 51,endpoint=False)
np.linspace(0,100,num = 51,endpoint=False,retstep = True)
np.arange([start,] stop,[step,]dtype=None)
'''
创建一个数字范围的数组
和python中的range功能类似
start:开始值(可选)
stop: 结束值(不可选)
step: 步长(可选)
dtype = None: 元素类型
'''
np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(2,10)
# array([2, 3, 4, 5, 6, 7, 8, 9])
np.arange(2,10,3)
# array([2, 5, 8])
np.random.randint(low, high=None,size=None, dtype = 'I')
'''
创建一个随机整数的多维数组
low:最小值
high=None:最大值
high=None时,生成的数字在[0,low)区间内
如果使用high这个值,则生成的数字在[low,high)区间
size=None: 数组形状,默认只输出一个随机值
dtype = None:元素类型b
'''
np.random.randint(3,10) #生成一个左闭右开的随机数
np.random.randint(3,10,size = 6) #生成1*6的数组
np.random.randint(3,10,size = (3,4)) # 生成3*4维的数组
np.random.randn(d0,d1,...,dn)
'''
创建一个服从标准正态分布的多维数组 N(0,1):以0为均数,1为标准差的正态分布
创建一个所有元素都为1的多维数组
dn: 第n维度的数值
'''
np.random.randn() # 生成一个数
np.random.randn(3,4) #生成3*4列,服从正太分布的随机数
np.random.normal(loc=0.0,scale = 1.0,size=None)
'''
创建一个服从正态分布的多维数组
loc=0.0:均值
scale: 标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
size=None:数组形状
'''
np.random.normal(loc=1,scale =0.5, size=(3,4))
np.random.random(size=none)
'''
创建一个元素为[0,1)的随机数的多维数组
size=None:数组大小
'''
np.random.rand(d0,d1,...,dn)
'''
创建一个元素为[0,1)的随机数的多维数组
和np.random.random功能类似,掌握其中一个即可
dn:第n个维度的数值
'''
### ndarry的属性
ndim:维度
shape:形状
size:总数据量
dtype:元素类型
```python
cat.ndim # 3
cat.shape # (1280,1280,3)
cat.size #4915200
cat.dtype # unit8 无符号整数
Ndarray的基本操作
索引
一维与列表完全一致 多维时同理
I=np.random.randint(0,10,size=(3,4))
I[-1,-1] # =I[-1][-1] = I[2][3]
根据索引修改数据
n[-1,-1]=90
切片
n[n,m] 左闭右开
I = np.arange(10)
# I = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
I[3:6]
# I = [3, 4, 5]
I[::-1] #反转
n=np.random.randint(0,10,size=(6,8))
'''
array([[3, 4, 8, 6, 6, 5, 5, 7],
[2, 3, 7, 1, 8, 2, 2, 4],
[6, 2, 1, 9, 4, 7, 3, 7],
[2, 8, 5, 7, 8, 3, 9, 8],
[7, 8, 3, 2, 3, 7, 1, 5],
[1, 1, 2, 5, 8, 5, 5, 3]])
'''
#取一行
n[0]
# 取连续的多行
n[1:4]
# 取不连续的多行:多加一个中括号
n[[1,2,4]]
# 取一列
print(n[:,0])
print(n[1:4,0])
# 取连续的多列:切片
print(n[:,2:5])
# 取不连续的多列:中括号
print(n[:,[1,3,6]])
#对行进行反转
n[::-1]
# 对列进行反转,相当与第三维度做反转
n[:,::-1]
n[::10] #表示每隔10个数去一个值
变形 reshape
n=np.arange(1,21)
n.shape
n2 = np.reshape(n, (4,5))
n2.reshape((5,4))
# 变成一维度
n2.reshape(20)
# 使用-1:表示任意剩余维度长度
n2.reshape((4,-1))
n2.reshape((-1,2))
# n2.reshape((-1,-1,2)) 会报错 不能写两个未知数
级联(两个数组合并)
np.comcatenate()
参数是列表或是元组
级联的数组维度必须相同
可通过axis参数改变级联的方向
左右合并:行数一致
上下合并:列数一致,默认上下级联
# 默认axis =0 行合并即上下级联
np.concatenate((n1,n2))
# axis = 1 列级联 即左右级联
np.concatenate((n1,n2),axis = 1)
np.hstack() 与 np.vstack()
水平级联和垂直级联
用法与上面一致
切分/拆分/分割
np.split 即可水平也可垂直拆分
np.vsplit 垂直拆分
np.hsplit 水平拆分
# 垂直拆分,平均拆成三份
np.vsplit(n,3)
# 垂直拆分,按照指定位置取拆分,(0,1],(1,2],(2,4],(4,5]
np.vsplit(n,(1,2,4))
# split: 可以做水平拆分或垂直拆分
#axis=0 行
#axis=1 列
np.split(n,2) #默认按行来拆分
np.split(n,2, axis=0)
np.split(n,(1,2,4),axis=1)
副本/复制/拷贝
copy() 函数创建副本赋值
n =np.arange(10)
n2 = n
n2[0]=100
display(n,n2)
#array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9])
拷贝(是一个深拷贝)
n1=np.arange(10)
n2 = n1.copy()
n2[0]=100
display(n1,n2)
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9])
聚合操作
np.sum
np.sum(n) # 整个数组的所有数相加的和
np.sum(n[3]) # 第三行的和
np.sum(n, axis =0) # 行相加,是每一列的多行相加
np.sum(n,axis=1) # 列相加,每一行的多列相加
# 求一个四维数组的后面两维度的和
np.sum(n,axis=(2,3))
np.min
np.max
np.mean
np.average
np.median
np.percentile
np.percentile(n,q=50) # 百分位数
np.argmin 第一个最小值对应的下标
np.argmax 第一个最大值对应的下标
np.std 标准差
np.var 方差
np.power(n,3) 求矩阵n的3次方
np.argwhere 按条件查找
np.argwhere(n==np.max(n)) #按条件找到所有最大值的下标
np.sum和np.nansum(nan: not a number)
non:数值类型,not a number: 不是一个正常的数值,表示空值
np.nan:float类型
n=np.array([1,2,3,np.nan])
np.sum(n) #nan
np.nansum(n) # 6.0
矩阵操作
基本矩阵操作
算数运算符
n+10
n-10
n*10
n/10
n//10 # 整数
n**2 #2次方 n**3 3次方
n% 2 #余数
n1+n2 #对应元素相加
n1*n2 #对应元素相乘
线性代数
矩阵积 np.dot()–第一个矩阵的列数和第二列的行数需要相等
其他操作:
矩阵的逆 np.linalg.inv(n) --矩阵n需要是方阵
矩阵的行列式 np.round(np.linalg.det(n))
矩阵的秩(满秩矩阵,奇异矩阵)
np.linalg.matrix_rank(n)
矩阵的正则化(归一化):
n=(n-min)/(max-min)
广播机制
ndarray广播机制的两条规则
规则一:为缺失的维度补维度
规则二:缺失元素用已有值填充
其他常见的数学操作
abs 求绝对值
sqrt 求平方跟
square 求平方
exp 求以e为底的指数
log(n) 求自然对数,以e为底的对数
log2(n)
log10(n)
sin
cos
tan 正切
round 四舍五入
ceil 向上取整
floor 向下取整
cumsum 累加
n=np.arange(0,10)
# n =[0,1,2,3,4,5,...,9]
np.cumsum(n)
# array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
np.e 表示e即2.7.。。。。
numpy的其他操作
ndarray排序(内部是快速排序):
np.sort():不改变原数组
ndarray.sort(): 改变原数组,不多占内存空间
ndarray文件操作
保存数组
save:保存ndarray到一个npy文件
savez: 将多个array 保存到做一个npz文件中
x= np.arange(5)
y= np.arange(10,20)
# save
np.save('x',x) # 文件名为x.npy
#savez
np.savez('arr.npz',xarr =x,yarr=y)
# .npy和npz文件打不开,当时可以读取出来
读取数组
# 使用save保存的
np.load('x.npy')
# 使用savez保存的
np.load('arr.npz')['xarr']
csv,txt 文件的读写操作
n = np.random.randint(0,10,size=(3,4))
# 写
np.savetxt('arr.csv',n,delimiter =',')
# 读
np.loadtxt('arr.csv',delimiter=',')