3 数据分析--Numpy

时间:2024-03-13 12:03:38

Numpy:用于存储和处理大型矩阵,比python自身的嵌套列表结构要高校很多

anaconda:是一个开源的python发行版本,包括conda,python以及一大堆安装好的工具包
ipython 开发环境,解释器
jupyter notebook是编辑工具

anaconda包含了jupyter notebook编辑器和ipython编辑器,我们可以在jupyter notebook中使用ipython解释器编写代码

jupyter中的魔法命令

  1. 执行.py文件:%run .py文件的路径
  2. 运行计时,一般用于统计耗时较长代码的运行时长:%time statement
    运行计时,一般用于统计耗时较短代码的运行时长:
    %timeit statement
    %timeit -r 运行次数 -n 循环次数 statement
    用于耗时较短
    %%timeit
    statement1
    statement2
    statement3
    用于耗时较长
    %%time
    statement1
    statement2
    statement3
  3. %who:查询当前会话的所有变量和函数名称
  4. %whos:查询当前会话的所有变量和函数名称的详细信息
  5. %who_ls: 返回一个字符串列表,列表中是当前会话的所有变量和函数名称
  6. 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=',')

相关文章