zoukankan      html  css  js  c++  java
  • 数据分析(Numpy基础)

    数据分析(Numpy基础)

    1.什么是数据分析?

    数据分析是指,用适当的统计分析方法,对收集来的大量数据进行分析,提取有用信息并形成结论,从而实现对数据的详细研究和概括总结的过程。

    2.python做数据分析的常用库

    1. numpy        基础数值算法
    2. scipy        科学计算
    3. matplotlib   数据可视化
    4. pandas       序列高级函数

    一、numpy概述

    1.什么是numpy?

    1. Numerical Python,数字的Python,弥补了Python语言所欠缺的数值计算能力。
    2. Numpy是其它数据分析及机器学习库的底层库。
    3. Numpy完全标准C语言实现,运行效率充分优化。
    4. Numpy开源免费。

    2.numpy发展历史

    1. 1995年,Numeric,Python语言数值计算扩充。
    2. 2001年,Scipy->Numarray,多维数组运算。
    3. 2005年,Numeric+Numarray->Numpy。
    4. 2006年,Numpy脱离Scipy成为独立的项目。

    3.numpy的性能

    1. 代码简洁:减少Python代码中的循环。
    2. 底层实现:厚内核(C)+薄接口(Python),保证性能。

    二、numpy基础

    1.ndarray数组

    1.Numpy中的数组是numpy.ndarray类实例化的对象,其中包括:

    元数据(metadata)存储对目标数组的描述信息,如:shape、dtype、size、data等,

    实际数据完整的数组数据

    将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面大部分对数组的操作仅仅是对元数据的操作,从而减少对实际数据的访问频率,提高性能。

    2.ndarray数组的特点:

    1. Numpy数组是同质数组,即所有元素的数据类型必须相同
    2. Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1
     1 import numpy
     2 
     3 #numpy.ndarray类的对象表示数组
     4 ary=numpy.array([1,2,3,4,5,6])
     5 print(ary,type(ary)) #[1 2 3 4 5 6] <class 'numpy.ndarray'>
     6 
     7 #ndarray的运算规则:数组一个矩阵
     8 ary=ary+10
     9 print(ary) #[11 12 13 14 15 16]
    10 
    11 ary=ary+ary  #个数对应才能运算
    12 print(ary)#[22 24 26 28 30 32]
    13 
    14 ary=ary>30  #比较运算
    15 print(ary) #[False False False False False  True]

     

    2.数组的4种创建方式

    (1)numpy.array(任何可被解释为Numpy数组的逻辑结构)

    (2)numpy.arange(起始值(0),终止值,步长(1))

    (3)numpy.zeros(数组元素个数, dtype='类型')

    (4)numpy.ones(数组元素个数, dtype='类型')

     1 import numpy
     2 
     3 #1.numpy.array()
     4 a1=numpy.array([[1,2,3],[4,5,6]])
     5 print(a1,type(a1))  #[[1 2 3][4 5 6]] <class 'numpy.ndarray'>
     6 
     7 #2.numpy.arange()
     8 a2=numpy.arange(0,10,2)
     9 print(a2,type(a2))  #[0 2 4 6 8] <class 'numpy.ndarray'>
    10 
    11 #3.numpy.zeros()
    12 a3=numpy.zeros((10,),dtype='float32')
    13 print(a3,type(a3))  #[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
    14 
    15 #4.numpy.ones()
    16 a4=numpy.ones((2,3),dtype='int32')
    17 print(a4,type(a4))  #[[1 1 1][1 1 1]]
    18 
    19 #numpy.ones_like()  numpy.zeros_like()
    20 #构建一个结构与a1相同的全1数组
    21 print(numpy.ones_like(a1))  #[[1 1 1][1 1 1]]

     

    3.数组的属性

    (1)数组属性汇总

    • shape - 维度

    • dtype - 元素类型

    • size - 元素数量

    • ndim - 维数,len(shape)

    • itemsize - 元素字节数

    • nbytes - 总字节数 = size x itemsize

    • real - 复数数组的实部数组

    • imag - 复数数组的虚部数组

    • T - 数组对象的转置视图

    • flat - 扁平迭代器

     1 import numpy as np
     2 
     3 a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
     4               [4 + 2j, 5 + 5j, 6 + 8j],
     5               [7 + 3j, 8 + 6j, 9 + 9j]])
     6 print(a.shape) # (3, 3)    一个元组表示3行3列
     7 print(a.dtype) # complex128    一个字符串,表示复数类型,为每个数据元素开辟16字节的内存空间
     8 print(a.ndim) # 2
     9 print(a.size)  # 9
    10 print(a.itemsize)  # 16    每个数据元素占用内存16字节
    11 print(a.nbytes) # 144    整个数组总大小为144字节
    12 print(a.real, a.imag, sep='
    ')  #复数的实部和虚部
    13 # [[1. 2. 3.]
    14 #  [4. 5. 6.]
    15 #  [7. 8. 9.]]
    16 # [[1. 4. 7.]
    17 #  [2. 5. 8.]
    18 #  [3. 6. 9.]]
    19 print(a.T)  #矩阵转置
    20 # [[1.+1.j 4.+2.j 7.+3.j]
    21 #  [2.+4.j 5.+5.j 8.+6.j]
    22 #  [3.+7.j 6.+8.j 9.+9.j]]
    23 print([elem for elem in a.flat])  #.flat多维数组转一维数组
    24 # [(1+1j), (2+4j), (3+7j), (4+2j), (5+5j), (6+8j), (7+3j), (8+6j), (9+9j)]
    25 b = a.tolist()   #数组转列表(加,)
    26 print(b)
    27 # [[(1+1j), (2+4j), (3+7j)], [(4+2j), (5+5j), (6+8j)], [(7+3j), (8+6j), (9+9j)]]

    (2)数组变维

    1.视图变维(数据共享)操作的是元数据,若任意实际数据改变,所有数组跟着变,.reshape(),.ravel()

    2.复制变维(数据独立):.flatten()

    3.就地变维:直接改变原数组对象的维度,不返回新数组,.shape,.resize()

     1 import numpy as np
     2 
     3 """
     4 1.共享数据变维:原数组维度不变,实际数据改变却都要跟着变
     5     ndarray.reshape(),ndarray.ravel()
     6 """
     7 a=np.arange(1,7)
     8 print(a,a.shape) #[1 2 3 4 5 6] (6,)
     9 
    10 b=a.reshape(2,3)
    11 print(b,b.shape) #[[1 2 3] [4 5 6]] (2, 3)
    12 
    13 #元数据独立,实际数据只一份
    14 print(a.shape)   #(6,)
    15 b[0,1]=666
    16 print(b)  #[[1 666 3] [4 5 6]]
    17 print(a)  #[1 666 3 4 5 6]
    18 
    19 c=a.reshape(-1,2)#-1表示自适应行数,指定2列
    20 print(c,c.shape)  #[[1 666] [3 4] [5 6]] (3, 2)
    21 
    22 # d=c.reshape(6,)  #多维变一维
    23 d=c.ravel()  #多维变一维
    24 print(d,d.shape)  #[1 666 3 4 5 6] (6,)
    25 
    26 """
    27 2.复制变维:元数据和实际数据互不影响
    28     ndarray.flatten(),copy.deepcopy()
    29 """
    30 e = c.flatten()  #多维变一维
    31 print(e)  #[  1 666   3   4   5   6]
    32 a += 10
    33 print(a, e, sep='
    ')
    34 # [ 11 676  13  14  15  16]
    35 # [  1 666   3   4   5   6]
    36 
    37 """
    38 3.就地变维:直接对改变原数组
    39     ndarray.shape,ndarray.resize()
    40 """
    41 print("----------------------------------------")
    42 a=np.arange(1,9)
    43 print(a,a.shape)  #[1 2 3 4 5 6 7 8] (8,)
    44 a.shape = (2, 4)
    45 print(a,a.shape)  #[[1 2 3 4] [5 6 7 8]] (2, 4)
    46 a.resize(2, 2, 2)
    47 print(a,a.shape)  #[[[1 2] [3 4]] [[5 6] [7 8]]] (2, 2, 2)

     

    (3)数组元素的数据类型:np.ndarray.dtype

    1.基本类型

    类型字符码字符码简写
    布尔型 'bool_ ' ?
    整数型 'int8/16/32/64' i1/i2/i4/i8
    无符号整形 'uint8/16/32/64' u1/u2/u4/u8
    浮点型 'float/16/32/64' f2/f4/f8
    复数型 'complex64/128' c8/c16
    字符串型 'str_ ' U<字符数>
    日期类型 'datetime64' M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]

     

     

     

     

     

     

     

     

     

     

     

    2.简写字符码解读

     类型释义 
    U7 包含7个字符的Unicode字符串,每个字符占4个字节,采用默认字节序。
    M8[D] 包含8字节的日期类型,每个日期数据占8个字节,采用默认字节序。
    3i4 大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。
    <(2,3)u8 小端字节序,6个元素2行3列的二维数组,每个元素都是无符号整型,每个无符号整型元素占8个字节。

     

     

     

     

     

     

    (4)数组元素的个数:np.ndarray.size

    (5)数组元素的索引(下标)

    1.多维数组的切片

     1 import numpy as np
     2 
     3 a=np.arange(1,10)
     4 a.resize(3,3)
     5 print(a)
     6 # [[1 2 3]
     7 #  [4 5 6]
     8 #  [7 8 9]]
     9 
    10 print(a[:2, :2]) #以,作为分隔,切前两行的前两列
    11 # [[1 2]
    12 #  [4 5]]
    13 print(a[::2,::2]) #切一三行的一三列
    14 # [[1 3]
    15 #  [7 9]]

     

      2.数组的掩码操作

     1 import numpy as np
     2 
     3 a=np.arange(0,10)
     4 # mask = [True, False,True, False,True, False,True, False,True, False]
     5 # print(a[mask])
     6 
     7 #1.bool掩码
     8 # mask=a%2==0
     9 # print(mask)
    10 # print(a[mask])
    11 print(a[a%2==0])  #[0 2 4 6 8]
    12 #输出100以内3与7的公倍数
    13 b=np.arange(1,100)
    14 print(b[(b%3==0)&(b%7==0)])  #[21 42 63 84]
    15 
    16 #2.索引掩码
    17 c=np.array([10,20,30,40])
    18 mask=[0,1,2,3,3,2,1,0]
    19 print(c[mask])  #[10 20 30 40 40 30 20 10]
    20 #为商品排序
    21 products=np.array(['Mi','Huawei','Apple','Samsang'])
    22 price=np.array([2999,4999,8888,3999])
    23 indices=np.argsort(price)# 为数组排序,返回有序索引
    24 # print(indices)  #[0 3 1 2]
    25 print(products[indices])

     

    4.数组的组合和拆分

    垂直方向:numpy.vstack(上,下),numpy.vsplit(c,n)

    水平方向:numpy.hstack(左,右),numpy.hsplit(c,n)

    深度方向:numpy.dstack(前,后),numpy.dsplit(c,n)

     

     

  • 相关阅读:
    memwatch内存泄露检测工具
    JavasSript实现秒转换为“天时分秒”控件和TDD测试方法应用
    字符编码转换笔记
    AjaxFileUpload 方法与原理分析
    Lua Rings库介绍
    Virtualbox+UbuntuServer+Xshell搭建Linux开发环境
    HTTP下载文件名称编码说明
    lua metatable 和 _index 实验
    前向后瞻正则表达式及其JS例子
    浏览器浏览记忆(history)几则技巧记录
  • 原文地址:https://www.cnblogs.com/lennie-luo/p/11773739.html
Copyright © 2011-2022 走看看