Python学习——numpy基础

一、基本数据结构

  1. numpy介绍
    numpy是一个专门用于矩阵化运算、科学计算的开源Python

    numPy将Python相当于变成一种免费的更强大的Matlab系统
    (1)强大的 ndarray 多维数组结构
    (2)成熟的函数库
    (3)用于整合C/C++和Fortran代码的工具包
    (4)实用的线性代数、傅里叶变换和随机数模块
    (5)Numpy和稀疏矩阵运算包scipy配合使用非常方便

  2. 基本数据结构ndarray
    矩阵表示:使用numpy,易得到二维矩阵

    eg:
    # 使用numpy之前必须先导入包
    import numpy as np
    
    array = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
    print(array)
    print(type(array))
    
    输出结果:
    [[1 2 3 4]
     [5 6 7 8]]
    <class 'numpy.ndarray'>
    

    作为ndarray对象里的数据有时并不是所需要的,那么可以使用ndarray对象的astype() 方法转为指定的数据类型

    eg:
    a2 = np.array(["1", "2", "3", "4"])
    print(a2)
    # 转换类型
    print(a2.astype("int"))
    # 查看矩阵信息(几行几列)
    print(a2.shape)
    print(array.shape)
    
    输出结果:
    ['1' '2' '3' '4']
    [1 2 3 4]
    (4,)
    (2, 4)
    

二、ndarray相关操作

  1. 索引
    将数据转为ndarray对象后,会需要按某种方式来抽取数据
    ndarray对象提供了两种索引方式:
    切片索引
    切片索引和对列表list的切片索引相似,不过由原本的一维切片变为多维
    索引后还可以直接对应该位置重新赋值
    可通过shape属性得到数组的行数和列数
    切片索引
    切片索引

    eg:
    a3 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    # 切片之后类型还是 ndarray
    print(a3)
    # 取某一个位置的数据
    print(a3[1, 2])
    # 取一部分数据
    print(a3[1:, 2:])
    # 矩阵翻转
    print(a3[::-1, ::-1])
    print(a3[::-1, ::])
    
    输出结果:
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    7
    [[ 7  8]
     [11 12]]
    [[12 11 10  9]
     [ 8  7  6  5]
     [ 4  3  2  1]]
    [[ 9 10 11 12]
     [ 5  6  7  8]
     [ 1  2  3  4]]
    

    布尔值索引
    通过添加条件判断数组中每个值的真/假转为布尔值再对原数组进行索引,为真(True)时会被抽取出来

    eg:
    # 布尔值索引
    print(a3[a3 > 5])
    print(a3 > 5)
    
    输出结果:
    [ 6  7  8  9 10 11 12]
    [[False False False False]
     [False  True  True  True]
     [ True  True  True  True]]
    
  2. 切分
    使用split将ndarray按照行平均分为几个ndarray

  3. 重构
    通过 reshape 方法将所有元素按照指定行指定列进行重构

    eg:
    # 重构
    print(a3.reshape(2, 6))
    
    输出结果:
    [[ 1  2  3  4  5  6]
     [ 7  8  9 10 11 12]]
    
  4. 拼接
    通过 vstack 沿纵轴拼接
    通过 hstack 沿横轴拼接
    通过 concatenate 进行拼接

  5. 转置、翻转
    转置: transpose 方法或者在数组后加 .T
    翻转: fliplr 左右翻转、flipud 上下翻转

    eg:
    # 转置
    print(a3.transpose())
    print(a3.T)
    # 左右翻转
    print(np.fliplr(a3))
    # 上下翻转
    print(np.flipud(a3))
    # 上下左右翻转
    print(np.flip(a3))
    
    输出结果:
    [[ 1  5  9]
     [ 2  6 10]
     [ 3  7 11]
     [ 4  8 12]]
    [[ 1  5  9]
     [ 2  6 10]
     [ 3  7 11]
     [ 4  8 12]]
    [[ 4  3  2  1]
     [ 8  7  6  5]
     [12 11 10  9]]
    [[ 9 10 11 12]
     [ 5  6  7  8]
     [ 1  2  3  4]]
    [[12 11 10  9]
     [ 8  7  6  5]
     [ 4  3  2  1]]
    
  6. 对位运算
    指ndarray进行加减乘除运算时,使对应位置的数值进行加减乘除运算

    eg:
    # 对位运算
    a6 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    a7 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
    print(a6 + a7)
    print(a6 - a7)
    print(a6 * a7)
    print(a6 / a7)
    
    输出结果:
    [[ 2  4  6  8]
     [10 12 14 16]
     [18 20 22 24]]
    [[0 0 0 0]
     [0 0 0 0]
     [0 0 0 0]]
    [[  1   4   9  16]
     [ 25  36  49  64]
     [ 81 100 121 144]]
    [[1. 1. 1. 1.]
     [1. 1. 1. 1.]
     [1. 1. 1. 1.]]
    

三、结构化数据

  1. 举例说明
    (1) 首先你需要一个数据文件,此处我新建了一个test.txt,内容如下
    1,2,3
    4,5,6
    7,8,9
    (2) 对此文件进行处理

    lines = []
    with open(r"E:\PycharmProjects\hello\test.txt", "r") as file:
        lines = file.readlines()
    
    test = [tuple(line.strip().split(",")) for line in lines]
    print(test)
    
    dtype = [("id", int), ("name", object), ("score", int)]
    
    np_test = np.array(test, dtype=(dtype))
    #按名称索引
    print(np_test["id"])
    #按名称索引 获取score=3的数据
    print(np_test[np_test["score"] == 3])
    
    输出结果:
    [('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9')]
    [1 4 7]
    [(1, '2', 3)]
    

四、内置操作函数

  1. 数学函数
    numpy.log()函数是numpy模块提供的现成自然对数函数
    数学函数

    eg:
    a8 = np.array([1, 2, 3, 4])
    print(np.log(a8))
    print(np.sin(a8))
    
    输出结果:
    [0.         0.69314718 1.09861229 1.38629436]
    [ 0.84147098  0.90929743  0.14112001 -0.7568025 ]
    
  2. 运算函数
    在计算的时候,会用到差分、累加的情况。numpy提供很多相关的运算函数
    差分:numpy.diff()方法

    eg:
    print(np.diff(a8))
    
    输出结果:
    [1 1 1]
    

    对于二维矩阵,需要指明是对哪一个维度进行差分
    二维矩阵差分

    eg:
    a9 = np.array([[1, 2, 3], [4, 5, 6]])
    # 行与行之间差分
    print(np.diff(a9, axis=0))
    # 列于列之间差分
    print(np.diff(a9, axis=1))
    
    输出结果:
    [[3 3 3]]
    [[1 1]
     [1 1]]
    
  3. 统计函数
    numpy提供了很多计算最大值、最小值、均值、中位数等统计量的 函数,比如统计最大值的函数numpy.amax()
    在这里插入图片描述

    eg:
    # 计算标准差
    print(np.std(a9))
    
    输出结果:
    1.707825127659933
    

五、随机模块random

  1. 伪随机数的产生,可从离散分布和连续分布中产生
    在蒙特卡洛方法、随机积分、随机过程模拟等很多方面都有应用
    指定随机种子(seed)产生相同的随机数序列

    eg:
    # 产生一个3行4列的矩阵,其中的每一个元素为[0, 1]之间的浮点型随机数
    r1 = np.random.rand(3, 4)
    print(r1)
    # 产生一个[0, 10]之间的整型随机数
    print(np.random.randint(0, 10))
    
    输出结果:
    [[0.94162658 0.09145497 0.56586785 0.19829864]
     [0.10717488 0.28461505 0.56043926 0.78945516]
     [0.59883978 0.08212525 0.97394346 0.32761456]]
    8
    
  2. 常用分布的产生方式

    eg:
    # 二项分布:产生5个服从二项分布B(5, 0.5)的样本
    print(np.random.binomial(n=5, p=0.5, size=5))
    # 均匀分布:产生5个服从均匀分布U[-1, 1]的样本
    print(np.random.uniform(-1, 1, 5))
    # 标准正态分布:产生2*5的标准正态分布样本
    print(np.random.normal(size=(2, 3)))
    # 正态分布:产生2*5的均值为0,标准差为5的正态分布样本
    print(np.random.normal(loc=0, scale=5, size=(2, 3)))
    
    输出结果:
    [1 2 2 1 0]
    [-0.52674721  0.50713521 -0.23635187 -0.37280082 -0.7381546 ]
    [[-0.69065465  0.02140358  0.22315663]
     [ 0.12292919  2.07374299  0.92140683]]
    [[-0.96394493  2.52926172  0.27291902]
     [ 1.36460891 -3.24371614 -3.30661156]]
    

猜你喜欢

转载自blog.csdn.net/narutodzx/article/details/105346611
今日推荐