• 第二章:NumPy基础


    第二章:NumPy基础

    1、数组对象ndarray

    2、数组数据类型

    3、NumPy生成伪随机数

    4、数组的访问与形态变换

    5、使用函数进行简单统计分析

    6、通用函数ufunc的运算

    7、用于数组的文件输入输出

     

    第1节:数组对象ndarray

    1、什么是ndarray

    一种存储单一数据类型的多维数组ndarray

    2、为什么在NumPy中使用ndarray

    NumPy的数组比Python的内置序列,占用更小的内存,执行的速度也更快 NumPy可以在整个数组上执行重复杂的计算,不要需要使用Python的for循环 基于NumPy的算法要比纯Python快10到100倍,可能还更多
    示例如下:

    In [ ]:
    # NumPy数组比Python内置序列,更快,内存更少
    import numpy as np
    nums = np.arange(10000000)
    nums_list = list(range(10000000))
    %time for i in range(10): nums = nums * 2
    %time for i in range(10): nums_list = [j*2 for j in nums_list]
    
     

    第2节:创建数组ndarray

    1、使用array函数创建数组

    In [ ]:
    import numpy as np
    # 创建一个一维数组
    arr = np.array([2, 4, 6, 8, 10])
    print(str.format('创建的数组为:{0}', arr))
    
    In [ ]:
    import numpy as np
    # 创建一个二维数组
    arr_two = np.array([[1, 2, 3], [4, 5, 6]])
    print(str.format('创建的二维数组为:
    {0}', arr_two))
    
     

    2、数组的常用属性

    * ndim    返回int,数组的维数
    * shape   返回tuple,数组的尺寸
    * size    返回int,数组的元素总数
    * dtype   返回data-type,元素类型
    * itemsize 返回int,表示数组的每个元素大小,以字节为单位
    In [ ]:
    import numpy as np
    # 创建一个二维数组
    arr_two = np.array([[1, 2, 3, 7], [4, 5, 6, 8], [0, 0, 0, 0]])
    print(str.format('创建的二维数组为:
    {0}', arr_two))
    
    # 查看数组的维数
    print(str.format('数组的维数:{0}', arr_two.ndim))
    # 查看数组的尺寸
    print(str.format('数组的尺寸:{0}', arr_two.shape))
    # 查看数组的元素总数
    print(str.format('数组的元素总数:{0}', arr_two.size))
    # 查看数组的类型
    print(str.format('数组的类型:{0}', arr_two.dtype))
    # 查看数组的元素大小,以字节为单位
    print(str.format('数组的元素大小,以字节为单位:{0}', arr_two.itemsize))
    
     

    3、数组的数据类型

    * int8、uint8 ... int64、uint64
    * float16 ... float128
    * bool
    * object
    * sting
    * uniccode_
    * 等等
    In [ ]:
    # 设置dtype类型
    import numpy as np
    arr1 = np.array([1, 2, 3.5, 4], dtype=np.float64)
    print(arr1)
    arr1.dtype
    
     

    4、数组的数据类型转换

    In [ ]:
    import numpy as np
    arr1 = np.array([1, 2, 3, 4])
    print(arr1)
    arr1.dtype
    arr2 = arr1.astype(np.float64)
    print(arr2)
    arr2.dtype
    
    In [ ]:
    import numpy as np
    print('整型转浮点型', np.float(10))
    
     

    5、其他创建ndarray数组的方法

    * arange函数:创建指定范围的数组
    * zeros函数:创建指定行列全为0的数组
    * ones函数:创建全1数组
    * empty函数:创建一个拥有趋近0值的空数组,值都是垃圾值
    * eye函数:创建一个对角矩阵,对角线上值为1
    * full函数:创建指定填充的数组
    * linspace函数:创建指定范围的一维等差数组
    * logspace函数:创建指定范围的一维等比数组  
    

    举例如下:

    In [ ]:
    import numpy as np
    arr1 = np.arange(20)
    print(arr1)
    arr2 = np.zeros((3, 4),dtype=np.float32)
    print(arr2)
    arr3 = np.ones((3,4))
    print(arr3)
    arr4 = np.empty((2, 3))
    print(arr4)
    arr5 = np.eye(3, 4)
    print(arr5)
    arr6 = np.full((3, 4), 100)
    print(arr6)
    arr7 = np.linspace(1, 9, 5)
    print(arr7)
    arr8 = np.logspace(0, 4 , 5, base=2)
    print(arr8)
    
     

    第3节:NumPy生成伪随机数

    1、使用random模块生成伪随机数创建数组

    函数说明
    seed 确定随机数生成器的种子
    permutaion 返回一个序列的随机排列或返回一个随机排列的数组
    shuffle(x) 对一个序列进行随机排序
    random(n) 产生[0,1)之间指数量的随机数
    rand()
    randint()
    randn
    binomial
    normal
    beta
    chisquare
    gamma
    uniform
    choice

    2、示例:

    In [ ]:
    import numpy as np
    # 产生10个[0,1)的随机数
    arr1 = np.random.random(10)
    print(arr1)
    
    arr2 = np.random.randn(3, 5)
    print(arr2)
    
    In [ ]:
    import numpy as np
    arr3 = np.arange(10)
    print(arr3)
    # 对数组随机排序
    np.random.shuffle(arr3)
    print(arr3)
    # 对已存在的数组随机读取
    arr4 = np.random.choice(arr3, 5)
    print(arr4)
    
     

    第4节:数组的访问与形态变换

    1、访问数组

    与列表操作类似,有如下操作

    • 数组名[下标]
    • 数组名[start:end],不包含end
    • 数组名[:end],0到end,不包含end
    • 数组名[:],取出所有元素

    2、通过索引与切片修改元素

    • 数组名[下标] = 值
    • 数组名[m:n] = 值

    示例

    In [ ]:
    import numpy as np
    arr  = np.arange(1, 20, 2)
    print(arr)
    print('取出下标为2的元素:', arr[2])
    print('取出倒数第2个元素:', arr[-2])
    print('获取数组的一个切片:', arr[2:5])
    print('获取数组的一个切片:', arr[:5])
    print('获取数组的一个切片:', arr[:])
    
    In [ ]:
    import numpy as np
    arr  = np.arange(1, 20, 2)
    print(arr)
    arr[0] = 0
    print(arr)
    arr[0:3] = [100, 99, 98]
    print(arr)
    arr[-3:-1] = 100
    print(arr)
    
    In [ ]:
    # 访问多维数组
    import numpy as np
    # 随机生成5*5矩阵,值为[0, 10)
    arr = np.random.randint(0, 100, size=(5, 5))
    print(arr)
    print('两种写法获取同一个元素:', arr[1][2], arr[1, 2])
    print('获取一列元素:', arr[0])
    
    In [ ]:
    # 访问多维数组
    import numpy as np
    # 随机生成5*5矩阵,值为[0, 10)
    arr = np.random.randint(0, 100, size=(5, 5))
    print(arr)
    print('切片操作获取元素:
    ', arr[0:2])
    print('切片操作获取元素:
    ', arr[1:3, 2:4])
    
     

    3、变换数组形态

    1. 改变数组形状
      • 利用数组的shape属性(改变原数组)
      • 利用reshape函数改变数组形状(原数组不变化
      • .T属性实现数组转置
    2. 展平数组
      • ndarray.ravel()
      • ndarray.flatten()
    3. 组合数组
      • 横向组合:np.hstack(arr1, arr2)
      • 纵向组合:np.vstack(arr1, arr2)
      • 横向组合:np.concatenate((arr1, arr2), axis=1)
      • 纵向组合:np.concatenate((arr1, arr2), axis=0)
    4. 分割数组
      • 横向分割:np.hsplit(arr, n)
      • 纵向分割:np.vsplit(arr, n)
      • 横向分割:np.split(arr, n, axis=1)
      • 纵向分割:np.split(arr, n, axis=0)

    示例:

    In [ ]:
    # 1. 改变数组形状
    import numpy as np
    arr = np.arange(16)
    print(arr)
    arr.shape = 4, 4
    print('改变之后:
    ', arr)
    print(arr)
    arr1 = arr.reshape(2, 8)
    print('arr1=:
    ', arr1)
    print(arr)
    arr2 = arr.T
    print(arr2)
    print(arr)
    
    In [ ]:
    # 2、展平数组
    import numpy as np
    arr = np.random.randint(0, 10, (3,4))
    print('原数组:
    ', arr)
    print('arvel展平数组:
    ', arr.ravel())
    print('原数组:
    ', arr)
    print('flatten横向展平数组:
    ', arr.flatten())
    print('flatten纵向展平数组:
    ', arr.flatten('F'))
    print('原数组:
    ', arr)
    
    In [ ]:
    # 3、组合数组
    import numpy as np
    arr1 = np.arange(9).reshape(3,3)
    print('数组1:
    ', arr1)
    arr2 = np.eye(3, 4)
    print('数组2:
    ', arr2)
    arr = np.hstack((arr1, arr2))
    print('组合数组:
    ', arr)
    
    In [ ]:
    # 4、分割数组
    import numpy as np
    arr = np.arange(16).reshape(4,4)
    print(arr)
    arr1 = np.hsplit(arr, 2)
    print(arr1)
    
     

    第5节:使用函数进行简单统计分析

    1、排序

    1. 直接排序
        * arr.sort(axis=1) 沿横轴排序
        * arr.sort(axis=0) 沿纵轴排序
    2. 间接排序
        * arr.argsort函数返回值为重新排序值的下标
        * np.lexsort(a, axis=1, kind='quicksort', order=None)函数返回值是按照最后一个传入数据排序
    

    示例:

    In [ ]:
    # 一维排序
    import numpy as np
    arr = np.random.randint(0, 10, size=10)
    print(arr)
    arr.sort()
    print('直接排序后:
    ', arr)
    
    arr1 = np.random.randint(100, 200, size=10)
    print(arr1)
    arr2 = arr1.argsort()
    print('间接排序后:
    ', arr2)
    print(arr1)
    
    In [ ]:
    # 二维排序
    import numpy as np
    arr = np.random.randint(0, 10, size=(3, 4))
    print(arr)
    arr.sort(axis=0)
    print('排序后:
    ', arr)
    
     

    2、去重复数据

    * np.unique函数:找出数组中唯一值并返回已排序的结果
    

    示例:

    In [ ]:
    # 去重
    import numpy as np
    arr = np.random.randint(0, 10, size=10)
    print(arr)
    arr1 = np.unique(arr)
    print(arr1)
    print(arr)
    
     

    3、重复数据(使数据重复)

    * np.tile(A, reps) A为指定重复的数组,reps为指定重复的次数
    * np.repeat(a, repeats, axis=None)
    

    示例:

    In [ ]:
    import numpy as np
    arr1 = np.arange(5)
    print(arr1)
    arr2 = np.tile(arr1, 3)
    print(arr2)
    arr3 = arr2.reshape(3,5)
    print(arr3)
    arr4 = np.repeat(arr3, 3, axis=1)
    print(arr4)
    
     

    4、集合运算

    * intersect1d(x, y)  返回交集,并排序
    * union1d(x, y)  返回并集,并排序
    * in1d(x, y)  返回一个X包含于Y的布尔型数组,就是Y中元素在X中则TRUE
    * setdiff1d(x, y) 返回差集
    * setxor1d(x, y)  对称差,交集之外部分
    

    示例:

    In [ ]:
    import numpy as np
    arr1 = np.random.randint(10, size=10)
    print(arr1)
    arr2 = np.random.randint(10, size=16)
    print(arr2)
    print('*' * 40)
    jiaoji = np.intersect1d(arr1, arr2)
    print('交集:', jiaoji)
    binji = np.union1d(arr1, arr2)
    print('并集:', binji)
    chaji = np.setdiff1d(arr1, arr2)
    print('差集:', chaji)
    duichengcha = np.setxor1d(arr1, arr2) 
    print('对称差:', duichengcha)
    in1d  = np.in1d(arr1, arr2)
    print(in1d)
    
     

    第6节:通用函数ufunc的运算

    1、什么是ufunc通用函数

    通用函数ufunc是一种对ndarray中的数据执行元素级运算的函数,返回值也是ndarray数组。 常用的ufunc函数有:

    • 数组运算函数
    • 三角函数
    • 位操作函数
    • 逻辑与比较运算函数
    • 浮动运等函数等等

    2、ufunc函数特点

    不需要对数组的每一个元素做操作,只需对整个数组操作,对数组做重复运算时,比math库的函数效率更高。

    示例:

    In [ ]:
    import numpy as np
    arr = np.array([1,2,3.2,4.5])
    print(arr*2, arr//2)
    print(arr)
    
     

    3、ufunc函数的运算

    * 四则运算:+、-、*、/、**
    * 比较运算 >等
    * 逻辑运算:np.any逻辑或,np.all逻辑与。返回布尔值
    

    示例:

    In [ ]:
    import numpy as np
    arr1 = np.random.randint(10, size=(3,3))
    arr2 = np.arange(9).reshape(3,3)
    print(arr1)
    print(arr2)
    arr3 = arr1 + arr2
    print(arr3)
    arr4 = arr1 * arr2
    print(arr4)
    # 数组比较
    arr5 = arr1 > arr2
    print('arr1与arr2比较:', arr5)
    # 逻辑运算
    print('逻辑或操作:', np.any(arr1 == arr2))
    print('逻辑与操作:', np.all(arr1 == arr2))
    
     

    4、常用统计函数

    方法说明
    sum 求和
    mean 求平均
    std var 标准差、方差
    min max 最小值、最大值
    argmin argmax 求最大最小元素的索引
    cumsum 求所有元素的累计和
    cumprod 求所有元素的累计积

    示例:

    In [23]:
    import numpy as np
    arr = np.arange(12).reshape(3,4)
    print(arr)
    
     
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    
    In [30]:
    # 求数组和
    sum = np.sum(arr)
    print(sum)
    # 求某行和
    sum_col1 = np.sum(arr[2])
    print(sum_col1)
    # 求纵轴和
    sum_0 = arr.sum(axis=0)
    print(sum_0)
    
     
    66
    38
    [12 15 18 21]
    
    In [32]:
    # 求均值
    mean = np.mean(arr)
    print(mean)
    # 求每行均值
    mean_1 = arr.mean(axis=1)
    print(mean_1)
    
     
    5.5
    [1.5 5.5 9.5]
    
    In [33]:
    print(np.min(arr))
    print(np.argmax(arr))
    print(np.cumsum(arr))
    
     
    0
    11
    [ 0  1  3  6 10 15 21 28 36 45 55 66]
    
     

    第7节:用于数组文件输入输出

    numpy能够读写磁盘上的文本数据或二进制数据

    1、读写二进制文件

    * np.save(path, arr)
    * np.load(path)
    * np.savez(path, arr1, arr2,...):可以将多个数组保存到一个文件中。用load读取多个数组时得到的不是一个数组,而是NpzFile类型,第一个数组键arr_0
    
    

    示例:

    In [34]:
    # 读写二进制文件
    import numpy as np
    arr = np.random.randn(5,4)
    print(arr)
    
     
    [[ 0.80378597 -1.66628083 -1.75615736 -0.09477648]
     [ 1.7750319   0.91832001 -0.29885098 -0.61517593]
     [ 1.03061256  0.91320213  0.25096307 -0.31003543]
     [ 0.51329869  1.33192425  0.48252581  1.99938431]
     [-1.2927339   0.00275658  0.84132183 -1.03839422]]
    
    In [35]:
    # 保存二进制文件
    import os
    try:
        # 在当前目录下创建文件
        os.mkdir("file")
        np.save("file/datas", arr)
        print('保存成功!!!')
    except(FileExistsError):
        print('目录已存在!')
    except:
        print('保存失败!!!')
    
     
    保存成功!!!
    
    In [36]:
    # 读取二进制文件
    arr_read = np.load('file/datas.npy')  # 读取要扩展名
    print('从文件中读取的数组为:
    ', arr_read)
    
     
    从文件中读取的数组为:
     [[ 0.80378597 -1.66628083 -1.75615736 -0.09477648]
     [ 1.7750319   0.91832001 -0.29885098 -0.61517593]
     [ 1.03061256  0.91320213  0.25096307 -0.31003543]
     [ 0.51329869  1.33192425  0.48252581  1.99938431]
     [-1.2927339   0.00275658  0.84132183 -1.03839422]]
    
    In [41]:
    # 保存多个数组
    arr1 = np.arange(10)
    arr2 = np.random.randint(0, 10, size=(2,2))
    try:
        np.savez('file/mul_datas', arr, arr1, arr2)
        print('保存成功!!!')
    except(FileExistsError):
        print('目录已存在!')
    except:
        print('保存失败!!!')
        
    
     
    保存成功!!!
    
    In [42]:
    # 读取多个数组文件.npz
    arr_mul = np.load('file/mul_datas.npz')
    for key in arr_mul:
        print('从文件中读取的数组为:
    ', arr_mul[key])
    
     
    从文件中读取的数组为:
     [[ 0.80378597 -1.66628083 -1.75615736 -0.09477648]
     [ 1.7750319   0.91832001 -0.29885098 -0.61517593]
     [ 1.03061256  0.91320213  0.25096307 -0.31003543]
     [ 0.51329869  1.33192425  0.48252581  1.99938431]
     [-1.2927339   0.00275658  0.84132183 -1.03839422]]
    从文件中读取的数组为:
     [0 1 2 3 4 5 6 7 8 9]
    从文件中读取的数组为:
     [[9 5]
     [9 3]]
    
     

    2、读写文本文件(或csv文件)

    * np.savetxt(path, arr, fmt="%.18e", delimiter="")
    将数组写到某种分隔符隔开的文本文件中,数据格式为 %.18e,分隔符默认为空格
    * np.loadtxt(path, delimiter="")
    

    示例:

    In [43]:
    # 读定文本文件
    import numpy as np
    arr = np.random.randn(5, 4)
    print(arr)
    
     
    [[ 0.09906544  0.93726524 -0.73591557  1.0949947 ]
     [-0.94174636  0.13029815 -1.49373294  0.92990397]
     [ 0.93432333  1.61824949  1.52093119 -0.6367427 ]
     [ 0.29956075  1.42559434 -0.08043672  0.67865451]
     [-0.46142749  0.6415095  -1.35882283 -1.3027818 ]]
    
    In [55]:
    # 保存文本文件
    import os
    try:
        # 在当前目录下创建文件
        os.mkdir("file_text")
        np.savetxt("file_text/datas.txt", arr, delimiter=",")
        print('保存成功!!!')
    except(FileExistsError):
        print('目录已存在!')
    except:
        print('保存失败!!!')
    
     
    保存成功!!!
    
    In [56]:
    # 读取文本文件
    arr_text = np.loadtxt("file_text/datas.txt", delimiter=",")
    print(arr_text)
    
     
    [[ 0.09906544  0.93726524 -0.73591557  1.0949947 ]
     [-0.94174636  0.13029815 -1.49373294  0.92990397]
     [ 0.93432333  1.61824949  1.52093119 -0.6367427 ]
     [ 0.29956075  1.42559434 -0.08043672  0.67865451]
     [-0.46142749  0.6415095  -1.35882283 -1.3027818 ]]
    
    In [ ]:
     
  • 相关阅读:
    Python的包管理工具Pip
    C语言移位运算符
    malloc函数具体解释
    HDU
    Java中Scanner的使用方法
    DOS call 中的%cd%,当前文件夹演示
    没有找到MSVCR100.dll解决方法
    什么是响应式表格(响应式表格和普通表格的区别)
    Redis和Memcache和MongoDB简介及区别分析(整理)
    GIT将本地项目上传到Github(两种简单、方便的方法)
  • 原文地址:https://www.cnblogs.com/sruzzg/p/13289894.html
Copyright © 2020-2023  润新知