Anaconda使用
- 为什么使用 Anaconda
- 缺点
- 文件比较大
- 优点
- 包非常齐全, 一般不会出现问题.
- 虚拟环境不会重新安装包,而是使用已有包的链接
- 缺点
- conda常用命令
- 进入cmd
- conda create -n env1 python=3.6
- 创建python3.6的env1虚拟环境
- conda create -n env1 python=3.6
- conda activate xxxx
- 开启xxxx环境
- conda deactivate
- 关闭环境
- conda env list
- 显示所有的虚拟环境
- conda remove -n xxxx --all
- 删除虚拟环境
- conda list
- 查看已经安装的文件包
- conda uninstall xxx
- 卸载xxx文件包
- 进入cmd
Numpy基础
-
导入numpy库
-
# 数据分析“三剑客” import numpy as np import pandas as pd import matplotlib.pyplot as plt
-
-
创建ndarray
-
使用np.array()由python list创建
-
numpy默认ndarray的所有元素的类型是相同的
- 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
- n = np.array(['hello', 1, 2, 3.14])
- 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
-
使用np的routines函数创建
- np.ones(shape, dtype=None, order='C')
- n = np.ones(5)
- 创建一个所有元素都为1的多维数组
- n = np.ones((3, 4), dtype=np.int)
- 整数,3行4列
- n = np.ones(5)
- np.zeros(shape, dtype=float, order='C')
- n = np.zeros((5, 6), dtype=int)
- 创建全为0的数组
- n = np.zeros((5, 6), dtype=int)
- np.full(shape, fill_value, dtype=None, order='C')
- n = np.full((3, 4), 8)
- 创建用指定元素填充的数组
- np.eye(N, M=None, k=0, dtype=float)
- np.eye(6, 6, dtype=int)
- 单位阵
- n = np.eye(5, 5, dtype=int, k=2)
- k表示偏移
- 对角线的1向右边移动两个位置
- k=-2对角线的1向左边移动两个位置
- k表示偏移
- np.eye(6, 6, dtype=int)
- np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
- n = np.linspace(0, 100, 50, dtype=float, endpoint=True, retstep=True)
- 创建一个等差数列
- 保留结束点,显示步长
- n = np.linspace(0, 100, 50, dtype=float, endpoint=True, retstep=True)
- np.arange([start, ]stop, [step, ]dtype=None)
- n = np.arange(6)
- 和python的range类似,作用是取一个范围
- n = np.arange(2, 10, 2)
- array([2, 4, 6, 8])
- np.random.randint(low, high=None, size=None, dtype='l')
- n = np.random.randint(1, 3)
- 随机的整数, 范围是:[1, 3)
- n = np.random.randint(1, 10, size=(3, 4, 5))
- 3维,总共3*4*5个随机数
- n = np.random.randint(0, 256, size=(6, 8, 3))
- plt.imshow(n)
- 创建一个随机图: 三维
- n = np.random.randint(1, 3)
- 操作图片
- cat = plt.imread('cat.jpg')
- cat.shape # 形状:4567303
- plt.imshow(cat)
- np.random.randn(d0, d1, ..., dn)
- 标准正太分布
- n = np.random.randn(10)
- array([ 2.25358397, 1.04323284, 0.2821671 , -1.31587675, -0.93080649, 0.86579112, -2.13239042, 3.31663086, -0.32907992, 0.57921973])
- np.random.normal(loc=0.0, scale=1.0, size=None)
- 正态分布
- n = np.random.normal(170, 5, size=(3, 4))
- 均值,方差
- 正态分布
- np.random.random(size=None)
- 生成0到1的随机数,左闭右开
- n = np.random.random(size=(3, 4))
- 生成0到1的随机数,左闭右开
- np.random.rand(3, 4)
- 返回一个或一组服从“0~1”均匀分布的随机样本值。
- np.ones(shape, dtype=None, order='C')
-
-
ndarray的属性
- n.ndim
- 维度
- n.shape
- 形状(各维度的长度)
- n.size
- 总长度3*4*5*......
- n.dtype
- 元素类型
- n.ndim
-
ndarray的基本操作
-
索引
- 一维
- n[4]
- 多维
- n[2][2]
- n[2, 2]
- 一维
-
切片
- 一维
- 与列表完全一致
- list1[:-1]
- list1[::-1]
- 多维
- n[0]
- 获取第一行
- n[0] = 0
- 修改第一行
- n[1:4]
- 切片取连续的行
- n[[1,3,4]]
- 取指定的多行
- n[:,0]
- 获取第一列
- n[:,[-1, 1]]
- 获取指定的多列
- n[:, 1:4]
- 获取连续的多列
- n[1:-1, 1:-1]
- 指定的行和列
- n[0]
- 一维
-
翻转
- n[::-1]
- 行翻转
- n[:, ::-1]
- 列翻转
- n[::-1]
-
n.transpose()/n.T
- 矩阵转置
- 和n[::-1, ::-1]不一样
-
变形
- 使用reshape函数,注意参数是一个tuple!
- n.reshape((4, 5))
- n.shape=20=4*5
- n3.reshape(20)
- 变成1维
- n3.reshape((20,))
- 变成1维
- n3.reshape((-1,))
- 变成1维
- 不需要考虑总数
- cat2 = cat.reshape((-1, 3))
- 第一维与第二维合并
- cat3 = cat.reshape((3, -1))
- 第二维与第三维合并
-
级联
-
np.concatenate() 级联需要注意的点
- 级联的参数是列表:一定要加中括号或小括号
- 维度必须相同
- 形状相符
- 级联的方向默认是shape这个tuple的第一个值所代表的维度方向
- 可通过axis参数改变级联的方向
-
display(n1, n2)
- 同时显示多个
-
np.concatenate((n1, n2))
- 默认上下合并
-
np.concatenate((n1, n2), axis=0)
- 默认axis=0 表示第一个维度 垂直合并
-
np.concatenate((n1, n2), axis=1)
- axis=1表示第二个维度 水平合并
-
np.hstack((n1, n2))
- 水平合并/水平级联
-
np.vstack((n1, n2))
- 垂直合并/垂直级联
-
n = np.array([[1,2,3], [4,5,6], [7,8,9]])
- np.hstack(n)
- 处理自己
- array([1, 2, 3, 4, 5, 6, 7, 8, 9])
- np.hstack(n)
-
n = np.array([1,2,3])
-
np.vstack(n)
-
处理自己
-
array([[1], [2], [3]])
-
-
-
-
切分/拆分/分隔
- np.vsplit(n, 4)
- 垂直拆分,行等分成4份
- np.vsplit(n, (1, 3, 5))
- 垂直拆分,在指定的下标位置拆分,可以有多个拆分点
- np.hsplit(n, 2)
- 水平拆分,将列等分成两份
- np.split(n, 2)
- 默认axis=0
- np.split(n, 2, axis=0)
- 按第一个维度拆分,垂直拆分/上下拆分
- np.split(n, 2 ,axis=1)
- 按第二个维度拆分,水平拆分/左右拆分
- np.vsplit(n, 4)
-
副本
-
所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效
-
可使用copy()函数创建副本
-
拷贝
-
n = np.random.randint(0, 10, size=(2, 4)) n2 = n.copy() n[0,0] = 99 display(n, n2) ''' array([[99, 5, 5, 3], [ 7, 5, 2, 8]]) array([[3, 5, 5, 3], [7, 5, 2, 8]]) '''
-
-
-
-
ndarray的聚合操作
-
求和
- 一维
- np.sum(n)
- n.sum()
- 二维
- np.sum(n, axis=0)
- 表示将每一列的所有行的数相加
- np.sum(n, axis=1)
- 表示将每一行的所有列的数相加
- np.sum(n, axis=(0, 1))
- 表示将指定维度的数求和
- np.nansum(n)
- 忽略nan
- np.sum(n, axis=0)
- 一维
-
最大最小值
- np.max/ np.min
-
平均值
- np.mean(n)
- np.average(n)
-
中位数
- np.median(n)
-
次幂
- np.power(n, 3)
- n**3
-
第一个最大数的下标
- np.argmax(n)
- n[np.argmax(n)] = 0
-
第一个最小数的下标
- np.argmin(n)
-
找到所有的最大数的下标
- np.argwhere(n==np.max(n)).reshape(-1)
-
其他聚合操作
- np.prod
- np.std
- np.var
- np.min
- np.max
- np.percentile
- Compute rank-based statistics of elements
- np.any
- Evaluate whether any elements are true
- np.all
- Evaluate whether all elements are true
- 所有的聚合操作都可以剔除nan
-
ndarray的矩阵操作
-
基本矩阵操作
-
算术运算符
- n + 10
- n - 10
- n * 10
- n / 10
- n % 6
- n // 4
- n ** 2
-
两个数组进行运算
-
+-*/
-
矩阵积np.dot()
- np.dot(n1, n2)
- 点积,矩阵乘法
-
广播机制
-
为缺失的维度补维度
-
假定缺失元素用已有值填充
-
''' array([[0], [1], + array([0, 1, 2]) = [0,0,0] [0,1,2] [0,1,2] [2]]) [1,1,1] + [0,1,2] = [1,2,3] [2,2,2] [0,1,2] [2,3,4] '''
-
-
-
-
-
ndarray的排序
- n2 = np.sort(n) # 不改变输入
- 不改变原数组,类似于Python中的sorted
- n.sort() # 本地处理,不占用空间,但改变输入
- 改变原数组,类似于Python中的sort
- n2 = np.sort(n) # 不改变输入