跳到正文

数据分析之numpy

numpy学习笔记

Posted by lili on August 20, 2020 · 读取中...

    numpy(数据计算)+pandas(数据提取)+matplotlib(可视化图表) 自学数据分析期间的学习笔记。

    数据分析

    为什么学习数据分析

    1.有岗位需求

    2.python数据科学的基础

    3.是机器学习课程的基础

    数据分析流程

    提出问题-准备数据-分析数据-获得结论-成果可视化

    numpy学习笔记

    前言:

    numpy库的用途实在太广了,最近研究生新生开学,准备做一个新生的大数据分析,所以学习一下数据分析。在此总结学习笔记。

    本教程大体上按照学习数据结构的方式,按照增删改查的顺序编写,以便自己复习时用,以后用到再补充。本目录格式,与思维导图保持一致,修改文档记得同步思维导图!

    什么是 NumPy?

    一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。

    为何使用 NumPy?

    快速,方便,科学计算的基础库

    numpy基础

    NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。我们可以使用 array() 函数创建一个 NumPy ndarray 对象。

    创建 NumPy ndarray 对象

    生成数组

    创建一个指定数组

    1
    
    t1 = np.array([1,2,3])
    

    快速生成指定数组

    1
    2
    3
    4
    5
    
    arr = np.array(range(10))#快速生成0-9的数组
    arr =np.arange(10)#快速生成0-9的数组
    a = np.arange(10,20,2)#10-20 步长为2
    a = np.arange(12).reshape((3,4))#0-11调整数组大小3行4列
    a = np.linspace(1,10,6).reshape((2,3))#从1-10平均分6段
    

    生成随机小数

    1
    
    arr = np.array([random.random() for i in range(10)])#利用random生成numpy中的小数
    

    保留小数位

    1
    
    t8 = np.round(t7,2)#保留2位小数
    
    多维数组

    创建一个指定的二维数组

    1
    
    array = np.array([[1,2,3],[2,3,4]])
    

    创建一个指定的三维数组

    1
    
    t3 =np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
    

    查看数组的形状

    1
    
    print(t3.shape)#查看数组的形状
    

    检查数组的维数

    1
    
    print(a.ndim) #检查数组的维数
    

    修改数组形状

    1
    
    t4 = t2.reshape(3,2)#修改数组形状
    

    查看元素个数

    1
    
    print('size',array.size)#元素个数
    

    展开数组

    1
    2
    
    newarr = arr.flatten()#展开数组,二维变一维
    newarr = arr.reshape(-1)#展开数组,二维变一维
    

    创建指定维数的数组

    1
    
    arr = np.array([1, 2, 3, 4], ndmin=5)#创建一个有 5 个维度的数组
    
    数据类型
    1
    2
    3
    4
    
    print(t4.dtype)#检查数组的数据类型
    arr = np.array(range(1,4),dtype="float32")#numpy中的数据类型
    arr = np.array([1,1,0,1,0,0],dtype=bool)#numpy中的bool类型
    t6 = t5.astype("int8")#调整数据类型
    

    ValueError:在 Python 中,如果传递给函数的参数的类型是非预期或错误的,则会引发 ValueError。 转换已有数组的数据类型

    1
    
    newarr = arr.astype('i')#复制新数组并转换为int
    
    随机数

    随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。

    生成随机整数

    1
    2
    3
    4
    5
    6
    7
    
    from numpy import random
    
    x = random.randint(100)#0-100之间的随机整数
    
    x=random.randint(100, size=(5))#生成一个 1-D 数组,其中包含 5 个从 0 到 100 之间的随机整数
    
    x = random.randint(100, size=(3, 5))#生成有 3 行的 2-D 数组,每行包含 5 个从 0 到 100 之间的随机整数
    

    生成随机浮点数

    1
    2
    3
    4
    5
    
    x = random.rand()#0-1之间随机浮点数
    
    x = random.rand(5)#生成包含 5 个随机浮点数的 1-D 数组
    
    x = random.rand(3, 5)#生成有 3 行的 2-D 数组,每行包含 5 个随机数
    

    从数组生成随机数

    1
    
    x = random.choice([3, 5, 7, 9])#返回数组中的值之一
    

    .seed(s)#随机数种子

    数组转置
    1
    2
    3
    
    t.T
    t.transpose()
    t.swapaxes(1,0)数组索引
    
    数组过滤filtering
    1
    2
    
    arr = np.array([61, 62, 63, 64, 65])  x = [True, False, True, False, True] newarr = arr[x] #过滤掉false的元素
    arr = np.array([61, 62, 63, 64, 65]) filter_arr = arr > 62 newarr = arr[filter_arr]#直接从数组创建过滤器
    
    迭代数组
    1
    2
    3
    4
    
    for x in np.nditer(arr):  print(x)#迭代输出数组的每一个值
    for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S'])#以字符串形式遍历数组
    for x in np.nditer(arr[:, ::2]):#每遍历 2D 数组的一个标量元素,跳过 1 个元素
    for idx, x in np.ndenumerate(arr):  print(idx, x)#枚举以下 1D 数组元素(带索引迭代)
    
    1
    2
    3
    4
    5
    
    A = np.arange(3,15).reshape(3,4)
    for row in A:
    	print(row)#迭代每一行,按行输出
    for column in A.T:
    	print(column)#迭代每一列。用.T转置 行变列
    

    数组索引

    访问 1-D 数组

    1
    2
    
    print(arr[0])#访问第一个元素
    print(arr[1])#访问第二个元素
    

    访问 2-D 数组

    1
    
    t[2,3]#访问3行4列元素
    

    访问 3-D 数组

    1
    
    print(arr[0, 1, 2])#访问第一个数组的第二个数组的第三个元素
    

    布尔索引

    1
    
    t[t>10]=10 
    

    数据切片

    选择行

    1
    2
    3
    
    t[2]#第二行
    t[2:]#第二行及以后
    t[3:,:]第三行及以后
    

    选择列

    1
    
    t[:,4:]
    

    选择行列

    连续的多行

    1
    2
    
    t[2:,:3]#3行后,3列前
    b = t2[2:5,1:4]#取多行和多列,取第三行到第五行,第二列到第四列的结果
    

    不连续

    1
    2
    
    c = t2[[0,2,2],[0,1,3]] # 00  21 23
    t[[1,3],[2,4]]#选择的是(1,2)(3,4)两个位置的值
    

    STEP裁剪步长

    1
    
    print(arr[1:5:2])从索引 1 到索引 5,返回相隔的元素
    

    数组赋值

    按位置赋值

    1
    
    t[2:,3]=3
    

    裁剪

    1
    2
    3
    4
    
    t.clip(10,20)#把小于10的替换为10,大于20的替换为20
    t3 = t2<10 #自动转换成bool 符合true 不符合false
    t2[t2<10]=3 #把小于10的都赋值为3
    t4= t2[t2>20]#取大于20的数
    

    三元运算符

    1
    
    np.where(t>10,20,0)#把t中大于10的替换为20,其他替换为0
    

    数组拼接Joining

    1
    2
    3
    4
    5
    6
    7
    
    t3 = np.vstack((t1,t2))#竖直拼接,沿列堆叠
    t4 = np.hstack((t1,t2))#水平拼接,沿行堆叠
    arr = np.dstack((arr1, arr2))#沿高度堆叠,该高度与深度相同
    t[[1,2],:]= t[[2,1],:] #行交换
    t[:,[0,2]] = t[:,[2,0]]#列交换
    arr = np.concatenate((arr1, arr2))#连接两个数组(水平)
    arr = np.concatenate((arr1, arr2), axis=1)#沿着行 (axis=1) 连接两个 2-D 数组
    

    数组拆分Spliting

    1
    2
    3
    4
    5
    6
    7
    8
    
    split()#数量不足时报错
    np.split(A,2,axis=1)#把A分成2块,纵向分割,等份
    array_split() #数量不足时自动调整元素
    newarr = np.array_split(arr, 3)#将数组分为 3 部分,不等分割
    print(newarr[0])#访问拆分的数组
    newarr = np.array_split(arr, 3, axis=1)#沿行拆分
    newarr = np.hsplit(arr, 3)竖直拆分
    newarr = np.vsplit(arr, 3)水平拆分
    

    数组计算

    NumPy 数学函数

    NumPy 提供了标准的三角函数:sin()、cos()、tan()。

    舍入函数

    numpy.around() 函数返回指定数字的四舍五入值。

    1
    
    numpy.around(a,decimals)#decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
    

    numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。

    np.floor(a)

    numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。

    np.ceil(a)

    NumPy 算术函数
    1
    2
    3
    4
    5
    6
    
    print(a + b)
    print(a - b)
    print(a * b)
    print(a / b)
    print(a ** 2)
    print(a < b) print(a > b)
    

    NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。需要注意的是数组必须具有相同的形状或符合数组广播规则。

    numpy.reciprocal() 函数返回参数逐元素的倒数。如 1/4 倒数为 4/1

    np.reciprocal(a)

    numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。

    numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。

    矩阵相乘

    矩阵相乘,就是矩阵的乘法操作,要求左矩阵的列和右矩阵的行数要一样,即MN维矩阵乘以和NY维矩阵

    1
    2
    3
    
    a = np.array([1,1],[0,1]])
    b = np.arange(4).reshape((2,2))
    c=a*b
    

    点乘

    矩阵点乘,就是矩阵各个对应元素相乘,要求矩阵必须维数相等,即MxN维矩阵乘以MxN维矩阵 。

    1
    2
    
    c_dot = np.dot(a,b)
    c_dot= a.dot(b)
    

    广播机制broadcast

    当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。

    广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。

    广播会在缺失和(或)长度为1的维度上进行。

    这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。

    shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?可以

    shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?不可以

    数组查找

    1
    2
    3
    4
    5
    6
    
    x = np.where(arr == 4)#查找值为 4 的索引
    x = np.where(arr%2 == 0)#查找值为偶数的索引
    x = np.where(arr%2 == 1)#查找值为奇数的索引
    x = np.searchsorted(arr, 7)#查找应在其中插入值 7 的索引,该方法从左侧开始搜索,并返回第一个索引,其中数字 7 不再大于下一个值。
    x = np.searchsorted(arr, 7, side='right')#从右边开始查找应该插入值 7 的索引
    x = np.searchsorted(arr, [2, 4, 6])#查找应在其中插入值 2、4 和 6 的索引
    

    数组排序

    1
    2
    3
    4
    
    a = np.sort(arr)#对数组进行排序,此方法返回数组的副本,而原始数组保持不变。
    arr = np.array(['banana', 'cherry', 'apple']) print(np.sort(arr))#对数组以字母顺序进行排序
    arr = np.array([True, False, True]) print(np.sort(arr))#对布尔数组进行排序
    arr = np.array([[3, 2, 4], [5, 0, 1]])print(np.sort(arr))#对 2-D 数组排序
    

    读取本地文件

    不咋用,pandas大法更好用

    1
    2
    
    np.loadtxt(file_path,delimiter,dtype)
    np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
    

    nan和inf

    nan

    nan(NAN,Nan):not a number表示不是一个数字

    什么时候numpy中会出现nan:

    • 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
    • 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

    nan注意的点

    • 两个nan是不相等的
    • np.nan!=np.nan
    • np.count_nonzero(na.nan!=np.nan)
    • nan和任何值计算都是nan
    • 判断一个值是否为nan np.isnan(a)
    • np.isnan(t1)效果和np.nan!=np.nan相同

    inf

    inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

    什么时候回出现inf包括(-inf,+inf)比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

    copy和view

    副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。

    1
    2
    3
    4
    5
    
    a=b 完全不复制,a和b相互影响
    a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
    a = b.copy(),复制新数组,a和b互不影响
    x = arr.view()#arr[0] = 61更改原数组,新数组也改变
    x = arr.view()#x[0] = 61更改新数组,原数组也改变
    

    检查数组是否拥有数据 print(x.base) 副本返回 None。 视图返回原始数组。

    numpy常用统计方法

    创建一个全0的数组: np.zeros((3,4))

    创建一个全1的数组:np.ones((3,4))

    创建一个对角线为1的正方形数组(方阵):np.eye(3)

    以下默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

    最小值位置索引:np.argmin(t,axis=1)

    最大值位置索引:np.argmax(t,axis=0)

    求和:t.sum(axis=None)#axis控制行或列

    累加:print(np.cumsum(A))

    差值:print(np.diff(A))

    均值:t.mean(a,axis=None) a.mean()). np.average(A)受离群点的影响较大

    中值:np.median(t,axis=None)

    最大值:t.max(axis=None)

    最小值:t.min(axis=None)

    极值:np.ptp(t,axis=None) 即最大值和最小值之差

    标准差:t.std(axis=None)

    标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值

    反映出数据的波动稳定情况,越大表示波动越大,约不稳定

    numpy

    列表转矩阵

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    import numpy  as np
    array = np.array([[1,2,3],[2,3,4]])
    print(array)
    print('number of dim',array.ndim)#维数,秩
    print('shape',array.shape)#nxn
    print('size',array.size)#元素个数
    import numpy  as np
    a = np.numpy([2,23,4],type=np.int64)# 
    print(a.dtype)
    a = np.zeros((3,4))#3行4列为0的矩阵,ones-1
    print(a)
    a = np.arange(10,20,2)#10-20 步长为2
    print(a)
    a = np.arange(12).reshape((3,4))#0-11调整数组大小3行4列
    print(a)
    a = np.linspace(1,10,6)reshape((2,3))#分段  
    print(a)
    
    

    数组

    1
    2
    3
    4
    5
    6
    7
    
    a = np.array([10,20,30,40])
    b = np.arange(4)#生成0-3
    print(a,b)
    c = a-b #加减乘除  平方 **
    d = 10*np.sin(a)#三角函数 cos tan 
    print(c)
    print(b<3)#输出true和false
    

    矩阵

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    a = np.array([1,1],[0,1]])
    b = np.arange(4).reshape((2,2))
     print(a)
     print(b)
    c=a*b
    c_dot = np.dot(a,b)
    c_dot_2 = a.dot(b)
     print(c)
    print(c_dot)
    a = np.random.random((2,4))#2行4列的随机数0-1
    print(a)
    print(np.sum(a))#求和
    print(np.sum(a,axis=1))#每一列 中
    print(np.min(a))#最小值
    print(np.sum(a,axis=0))#每一行中
    print(np.max(a))#最大值
    A = np.arange(2,14).reshape((3,4))
    print(np.argmin(A))#最小值的索引   0
    print(np.argmax(A))#最大值的索引  11
    print(A)
    print(np.mean(A))#平均值
    print(A.mean())#同上
    print(A.average())#同上
    print(np.median(A))#中位数
    print(np.cumsum(A))#累加 
    print(np.diff(A))#差值
    print(np.nonzero(A))#非0
    print(np.sort(A))#逐行排序
    
    

    矩阵相乘

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    print(np.transpose(A))#行变列 列变行 3乘4 变 4乘3
    print(A.T)#和上面一样
    print((A.T).dot(A))#乘法运算
    print(np.clip(A,5,9))#大于9都变成9。小于5变成5,保留5 9中间的数字
    print(np.mean(A,axis=0))# 0 对于列计算。1对于行计算
    A = np.arange(3,15)
    print(A)
    print(A[3])#索引(一维)
    A = np.arange(3,15).reshap(3,4)
    print(A)
    print(A[2])#索引出第3行
    print(A[2] [1])#索引出第3行的第1列
    print(A[2,1])#同上
    print(A[:,1])#索引出第1列所有的
    print(A[1,1:3])#索引出第2行第2-3个数
    for row in A:
    print(row)#迭代每一行
    for column in A.T:
    print(column)#迭代每一列。用.T转置
    

    合并

    1
    2
    3
    4
    5
    6
    7
    
    A = np.array([1,1,1])
    B = np.array([2,2,2])
    C = np.vstack((A,B)) #vertical stack 上下合并,输出2*3的数组
    D = np.hstack((A,B))#horizontal stack左右合并,
    print(A.shape,D.shape)
    print(A[np.newaxls].shape)#前面加一个维度
    
    

    分割

    1
    2
    3
    4
    5
    6
    7
    
    A = np.arange(12).reshape(3,4))
    print(A)
    print(np.split(A,2,axis=1))#把A分成2块,纵向分割,等份
    print(np.array_split(A,3,axis=1))#不等分割
    print(np.vsplit(A,3))#纵向分割
    print(np.hsplit(A,2))#横向分割
    
    

    赋值

    1
    2
    3
    4
    5
    6
    7
    
    a = np.arange(4)
    b=a
    c=a
    d=b
    a[0]=11#所有变量都会改
    d[1:3] = [22,33]
    b = a.copy() #deep copy   b不随a关联,