• python数据分析实战---Numpy科学计算工具


    Numpy基本认识

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

    NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

    • 一个强大的N维数组对象 ndarray
    • 广播功能函数
    • 整合 C/C++/Fortran 代码的工具
    • 线性代数、傅里叶变换、随机数生成等功能

    Numpy基础数据结构

    NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。

    在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

    很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

    NumPy 的数组中比较重要 ndarray 对象属性有:

    属性说明
    ndarray.ndim 秩,即轴的数量或维度的数量
    ndarray.shape 数组的维度,对于矩阵,n 行 m 列
    ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
    ndarray.dtype ndarray 对象的元素类型
    ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
    ndarray.flags ndarray 对象的内存信息
    ndarray.real ndarray元素的实部
    ndarray.imag ndarray 元素的虚部
    ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
    import numpy
    
    
    ar = numpy.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
    print(ar)
    
    print(ar.ndim)
    print(ar.shape)
    print(ar.size)
    print(ar.itemsize)
    print(ar.data)
    print(ar.dtype)
    print(ar.flags)
    print(ar.real)
    print(ar.imag)
    
    结果:
    [[1 2 3 4 5]
     [2 3 4 5 6]
     [3 4 5 6 7]]
    2
    (3, 5)
    15
    4
    <memory at 0x00000000056EF748>
    int32
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
      UPDATEIFCOPY : False
    
    [[1 2 3 4 5]
     [2 3 4 5 6]
     [3 4 5 6 7]]
    [[0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]]  

    创建数组

    array()函数  括号内可以是list,元组、数组、生成器等

    ar = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
    ar1 = np.array(range(10))
    ar2 = np.array(10)
    ar3 = np.array([[1,2,3,4,5],[2,3,4,5,6],['a','b','c','d']])
    print(ar)
    print(ar1)
    print(ar2)
    print(ar3)
    
    输出结果:
    [[1 2 3 4 5]
     [2 3 4 5 6]
     [3 4 5 6 7]]
    [0 1 2 3 4 5 6 7 8 9]
    10
    [list([1, 2, 3, 4, 5]) list([2, 3, 4, 5, 6]) list(['a', 'b', 'c', 'd'])] 

    arange()函数  类似于range(),在给定间隔内返回均匀间隔的值

    print(np.arange(10))
    print(np.arange(10.0))
    print(np.arange(5,12))
    print(np.arange(5.0,12.3))
    
    
    输出结果:
    [0 1 2 3 4 5 6 7 8 9]
    [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
    [ 5  6  7  8  9 10 11]
    [ 5.  6.  7.  8.  9. 10. 11. 12.]
    print(numpy.linspace(5,14,num=10)) #返回在间隔【开始,停止】上计算的num个均匀间隔的样本
    print(numpy.linspace(5,14,num=11))
    
    print(numpy.zeros((4,4),dtype=numpy.int))  #创建指定大小的数组,数组元素以 0 来填充
    
    ar = numpy.array([range(10),range(10,20)])
    print(numpy.zeros_like(ar))
    print(ar)
    
    print(numpy.ones((2,3),dtype=numpy.int))    #创建指定大小的数组,数组元素以 1 来填充
    
    #ones_like()和zeros_like()相似
    
    print(numpy.eye(3,dtype=numpy.int)) #创建一个正方的N+N的单位矩阵,对角线值位1,其余的值为0
    
    
    输出结果:
    [ 5.  6.  7.  8.  9. 10. 11. 12. 13. 14.]
    [ 5.   5.9  6.8  7.7  8.6  9.5 10.4 11.3 12.2 13.1 14. ]
    [[0 0 0 0]
     [0 0 0 0]
     [0 0 0 0]
     [0 0 0 0]]
    [[0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]]
    [[ 0  1  2  3  4  5  6  7  8  9]
     [10 11 12 13 14 15 16 17 18 19]]
    [[1 1 1]
     [1 1 1]]
    [[1 0 0]
     [0 1 0]
     [0 0 1]]

    Numpy通用函数

    翻转数组   numpy.T

    修改数组形状  numpy.reshape

    返回指定形态新数组  numpy.resize

    import numpy as np
    
    ar = np.arange(10)
    ar1 = np.zeros((2,4))
    print(ar)
    print(ar1)
    print(ar.T)
    print(ar1.T)
    
    ar2 = np.arange(12)
    ar3 = np.arange(12).reshape(3,4)
    print(ar2)
    print(ar3)
    
    print(np.resize(ar3,(4,4)))
    
    输出结果:
    [0 1 2 3 4 5 6 7 8 9]
    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    [0 1 2 3 4 5 6 7 8 9]
    [[0. 0.]
     [0. 0.]
     [0. 0.]
     [0. 0.]]
    [ 0  1  2  3  4  5  6  7  8  9 10 11]
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [ 0  1  2  3]]

    数组的复制 copy()

    ar = np.arange(10)
    print(ar)
    ar1 = ar
    ar1[2]=100
    print(ar,ar1)
    
    ar3 = ar.copy()
    ar3[3]=998
    print(ar,ar3)
    
    输出结果:
    [0 1 2 3 4 5 6 7 8 9]
    [  0   1 100   3   4   5   6   7   8   9] [  0   1 100   3   4   5   6   7   8   9]
    [  0   1 100   3   4   5   6   7   8   9] [  0   1 100 998   4   5   6   7   8   9]

    数组的字符转换

    ar2 = numpy.array(range(16)).reshape(4,4)
    ar3 = ar2.astype(numpy.str)
    print(ar3)
    
    输出结果:
    [['0' '1' '2' '3']
     ['4' '5' '6' '7']
     ['8' '9' '10' '11']
     ['12' '13' '14' '15']]

    连接数组

    ar = np.array([[1,2,3],[4,5,6]])
    ar1 = np.array([[7,8,9],[10,11,12]])
    
    ar2 = np.stack((ar,ar1),0) #沿新轴连接数组序列
    ar3 = np.hstack((ar,ar1))# 横向连接
    ar4 = np.vstack((ar,ar1))#纵向连接
    print(ar2,ar3,ar4)
    
    输出结果:
    [[[ 1  2  3]
      [ 4  5  6]]
    
     [[ 7  8  9]
      [10 11 12]]]
     [[ 1  2  3  7  8  9]
     [ 4  5  6 10 11 12]]
     [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    

    分割数组

    ar = np.arange(16).reshape(4,4)
    ar1 = np.vsplit(ar,2)  #纵向拆分
    ar2 = np.hsplit(ar,2)  #横向拆分
    print(ar)
    print(ar1)
    print(ar2)
    
    输出结果:
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [12 13 14 15]]
    [array([[0, 1, 2, 3],
           [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
           [12, 13, 14, 15]])]
    [array([[ 0,  1],
           [ 4,  5],
           [ 8,  9],
           [12, 13]]), array([[ 2,  3],
           [ 6,  7],
           [10, 11],
           [14, 15]])]

    数组的计算

    ar2 = numpy.array(range(16)).reshape(4,4)
    ar3 = ar2.astype(numpy.str)
    print(ar3)
    ar4 = ar2*10+100
    print(ar4)
    print(ar4.mean()) #求平均值
    print(ar4.sum()) #求总值
    
    输出结果:
    [['0' '1' '2' '3']
     ['4' '5' '6' '7']
     ['8' '9' '10' '11']
     ['12' '13' '14' '15']]
    [[100 110 120 130]
     [140 150 160 170]
     [180 190 200 210]
     [220 230 240 250]]
    175.0
    2800
    

    Numpy索引和切片

    基本索引及切片

    import  numpy as np
    
    #一维数组索引 类似于list
    ar  = np.arange(20)
    # print(ar[2])
    # print(ar[3:5])
    # print(ar[::2])
    
    
    #二维数组以及多维数组的逻辑和一维的一样
    ar1 = ar.reshape(4,5)
    # print(ar1)
    print(ar1[2][2])
    print(ar1[2:4][0][2])
    print(ar1[:2])
    
    输出结果:
    12
    12
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    

    布尔型的索引及切片

    ar = np.arange(12).reshape(3,4)
    print(ar)
    
    i = np.array([True,False,True])
    j = np.array([True,False,True,False])
    print(i)
    print(j)
    print(ar[i,:])  #在行中判断,只保留True的值
    print(ar[:,j]) #在第二维度中判断,只保留True的值
    
    print(ar[ar>5])  #生成一个新的数组
    
    输出结果:
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    [ True False  True]
    [ True False  True False]
    [[ 0  1  2  3]
     [ 8  9 10 11]]
    [[ 0  2]
     [ 4  6]
     [ 8 10]]
    [ 6  7  8  9 10 11]

    Numpy随机数

    print(np.random.normal(size=(4,4)))  #随机数生成
    
    print(np.random.rand(4))   #生成一个【0-1】之间的随机浮点数或者是N维数组  ---均匀分布
    print(np.random.rand(2,4))
    print(np.random.randn(4))  #生成一个【0-1】之间的随机浮点数或者是N维数组 ---正态分布
    print(np.random.randn(2,4))
    print(np.random.randint(5))  #生成一个整数或者N维整数数组
    print(np.random.randint(10,50,size=(4,4)))

    Nmupy数据输入和输出

    ar = numpy.random.randint(0,100,size=(10,10))
    numpy.savetxt("savetxt.txt",ar,delimiter=",",fmt="%i")   #数据的输出
    
    txt_load = numpy.loadtxt("savetxt.txt",delimiter=',')    #数据的输入
    print(txt_load)
    # print(ar)
    

    相关链接:

  • 相关阅读:
    sql处理数据库锁的存储过程
    SQL语句
    partial 函数
    map函数
    python命令行上下 退格,左右键不能用
    postgresql 在linux上的源码安装
    python字典操作
    根据key存不存在查询json
    精典博文
    python解析XML之ElementTree
  • 原文地址:https://www.cnblogs.com/garrett0220/p/11495597.html
Copyright © 2020-2023  润新知