• python学习笔记35:numpy_learn


    numpy_learn

    重要特点:N维数组对象,即ndarray对象
    ndarray对象中存储的数据类型要是一致的

    import numpy as np
    data = np.arange(12).reshape(3,4)
    data
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    # 维度个数
    data.ndim
    
    2
    
    # 数组维度
    data.shape
    
    (3, 4)
    
    # 数组元素总个数
    data.size
    
    12
    
    # 数组元素类型
    data.dtype
    
    dtype('int64')
    
    # 数组元素字节大小
    data.itemsize
    
    8
    

    创建Numpy对象

    array(),括号里面传入python数据类型,如list、tuple等

    import numpy as np
    data1 = np.array([1,2,3])  # 传入列表,构建一个1维数组
    data1
    
    array([1, 2, 3])
    
    data1.ndim
    
    1
    
    data2 = np.array([[1,2,3],[2,3,4]])
    data2
    
    array([[1, 2, 3],
           [2, 3, 4]])
    
    # 括号里面传入元组
    np.zeros((3,4))
    
    array([[0., 0., 0., 0.],
           [0., 0., 0., 0.],
           [0., 0., 0., 0.]])
    
    np.ones((3,4))
    
    array([[1., 1., 1., 1.],
           [1., 1., 1., 1.],
           [1., 1., 1., 1.]])
    
    # 空数组,里面的数据是随机的,默认的数据float64
    np.empty((3,4)).dtype
    
    dtype('float64')
    
    # 返回的是一个数组,而不是列表
    # 等差数组
    np.arange(1,20,5)
    
    array([ 1,  6, 11, 16])
    
    # 可以申明元素数据类型
    np.ones((3,4), int)
    
    array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [1, 1, 1, 1]])
    

    ndarray对象的数据类型

    int,float,bool,unicode,string,complex

    data_one = np.array([1,2,3])
    data_one.dtype.name
    
    'int64'
    

    数据类型转化
    asdtype()

    data_turn1 = data_one.astype('float64')
    data_turn1.dtype
    
    dtype('float64')
    
    data_turn2 = data_one.astype(np.float32)
    data_turn2.dtype
    
    dtype('float32')
    
    # 字符直接转数字
    str_data = np.array(['1','2'])
    str_data
    
    array(['1', '2'], dtype='<U1')
    
    str_data1 = str_data.astype(np.int)
    str_data1
    
    array([1, 2])
    

    数组运算

    # 对应元素相加、减、乘、除
    data1 = np.array([1,2,3])
    data2 = np.array([2,3,4])
    data1 + data2
    
    array([3, 5, 7])
    
    # 数组广播,数组形状不同时,做运算会自动进行扩展
    data3 = np.array([[1],[2],[3],[4]])
    data3
    
    array([[1],
           [2],
           [3],
           [4]])
    
    data4 = np.array([1,2,3])
    data4
    
    array([1, 2, 3])
    
    data3 + data4
    
    array([[2, 3, 4],
           [3, 4, 5],
           [4, 5, 6],
           [5, 6, 7]])
    
    data3 + 10
    
    array([[11],
           [12],
           [13],
           [14]])
    

    数组的索引与切片

    1维数组

    data1 = np.arange(10)
    data1
    
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    data1[0]
    
    0
    
    data1[0:3]
    
    array([0, 1, 2])
    
    data1[:3]
    
    array([0, 1, 2])
    
    data1[:6:1]
    
    array([0, 1, 2, 3, 4, 5])
    
    data1[:6:2]
    
    array([0, 2, 4])
    

    2维数组

    data2 = np.array([[1,2,3],[2,3,4],[3,4,5]])
    data2
    
    array([[1, 2, 3],
           [2, 3, 4],
           [3, 4, 5]])
    
    data2[0]
    
    array([1, 2, 3])
    
    data2[0:2] # 后不包
    
    array([[1, 2, 3],
           [2, 3, 4]])
    
    data2[0:2,0:2]
    
    array([[1, 2],
           [2, 3]])
    
    # 获取某一列时,行哪里要用:
    data2[:,0:2]
    
    array([[1, 2],
           [2, 3],
           [3, 4]])
    

    花式索引

    # 建立空数组
    data1 = np.empty((4,4))
    data1
    
    array([[ 5.92878775e-323,  0.00000000e+000,  0.00000000e+000,
             0.00000000e+000],
           [ 0.00000000e+000,  0.00000000e+000,  0.00000000e+000,
             0.00000000e+000],
           [ 0.00000000e+000,  0.00000000e+000,  0.00000000e+000,
             0.00000000e+000],
           [ 2.68156159e+154, -1.49458022e-154,  2.68156159e+154,
            -4.34384816e-311]])
    
    # 动态为数组添加元素
    for i in range(4):
        data1[i] = np.arange(i, i+4)
        
    data1
    
    array([[0., 1., 2., 3.],
           [1., 2., 3., 4.],
           [2., 3., 4., 5.],
           [3., 4., 5., 6.]])
    
    # 获取第0、2行数据
    data1[[0,2]]
    
    array([[0., 1., 2., 3.],
           [2., 3., 4., 5.]])
    
    data1[[0,2], [0,1]]
    
    array([0., 3.])
    

    布尔索引

    data1 = np.arange(12).reshape(3,4)
    data1
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    data1 == 1
    
    array([[False,  True, False, False],
           [False, False, False, False],
           [False, False, False, False]])
    
    data1[data1 == 2]
    
    array([2])
    

    数组转置和轴对称

    data1 = np.arange(12).reshape(3,4)
    data1
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    data1.T
    
    array([[ 0,  4,  8],
           [ 1,  5,  9],
           [ 2,  6, 10],
           [ 3,  7, 11]])
    

    numpy通用函数

    • abs fabs 绝对值

    • sqrt 平方根

    • square 平方

    • exp 指数幂

    • log、log10、log2、log1p

    • sign 符号函数,正数1,负数-1,0

    • ceil 大于等于最小整数

    • floor 小于等于最大整数

    • rint 四舍五入后的最小整数

    • modf 小数和整数分开为两个独立数组的形式返回

    • isnan 是否为整数

    • isfinite isinf 无穷和有穷

    • sin sinh cos cosh tan tanh

    • arcos arccosh arcsin

    • add 加法

    • substract 减法

    • multiply 乘

    • divide floor_divide 除和整除

    • maximum fmax 最大

    • minimum fmin 最小

    • mod 求摸

    • copysign 复制元素符号

    data = np.array([4,9,16])
    
    np.sqrt(data)
    
    array([2., 3., 4.])
    
    np.ceil(data)
    
    array([ 4.,  9., 16.])
    

    数据分析

    条件逻辑转为数组运算

    data1 = np.array([1,2,3])
    data2 = np.array(['a','b','c'])
    data3 = np.array([True, False, True])
    # 当data3中为True时,从data1中取值,反之取data2
    np.where(data3,data1,data2)
    
    array(['1', 'b', '3'], dtype='<U21')
    

    数组统计运算

    data1 = np.arange(12)
    data1
    
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    
    data1.sum()
    
    66
    
    data1.mean()
    
    5.5
    
    data1.min()
    
    0
    
    data1.max()
    
    11
    
    # 最小值索引
    data1.argmin()
    
    0
    
    data1.argmax()
    
    11
    
    data1.cumsum()
    
    array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45, 55, 66])
    
    # 累计求乘积
    data1.cumprod()
    
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    

    排序

    data = np.arange(12).reshape(3,4).T
    data
    
    array([[ 0,  4,  8],
           [ 1,  5,  9],
           [ 2,  6, 10],
           [ 3,  7, 11]])
    
    data.sort()
    data
    
    array([[ 0,  4,  8],
           [ 1,  5,  9],
           [ 2,  6, 10],
           [ 3,  7, 11]])
    
    data.sort(0)
    data
    
    array([[ 0,  4,  8],
           [ 1,  5,  9],
           [ 2,  6, 10],
           [ 3,  7, 11]])
    

    检查数组元素

    data = np.array([1,2,3])
    data
    
    array([1, 2, 3])
    
    np.any(data>4)
    
    False
    
    np.all(data>0)
    
    True
    

    唯一化及其他集合逻辑

    # unique取唯一值,并对数组进行排序
    data = np.array([3,3,2,1])
    np.unique(data)
    
    array([1, 2, 3])
    
    • np.in1d(a,b) 判断a数组元素是否在b数组里面,返回布尔结果
    • np.intersect1d(a,b) 计算a,b中的公共元素,并返回排序结果
    • np.union1d(a,b) 计算a,b的并集,并返回有序结果
    • np.setdiff1d(a,b) 集合的差
    • np.setxor1d(a,b) 集合的对称差,即存在一个数组中,但是不同时存在两个数组的元素

    线性代数模块

    numpy.linalg模块中有一组标准的矩阵分解以及逆和行列式之类的东西

    x = np.array([[1],[2]])
    y = np.array([3,4]).reshape(1,2)
    x
    
    array([[1],
           [2]])
    
    y
    
    array([[3, 4]])
    
    np.dot(x,y)
    
    array([[3, 4],
           [6, 8]])
    
    • np.dot() 点积
    • np.diag() 以1维数组的形式返回方阵的对角线,或将1维数组转化为方阵
    • np.trace() 计算对角线元素的和
    • np.linalg.det() 计算矩阵的行列式
    • np.linalg.eig() 计算方阵的特征值和特征向量
    • np.linalg.inv() 计算方阵的逆
    • np.linalg.qr() 计算qr分解
    • np.linalg.svd() 计算奇异值
    • np.linalg.solve() 解线性方程组Ax=b,其中A是一个方阵
    • np.linalg.lstsq() 计算Ax=b的最小二乘解
    data = np.arange(16).reshape(4,4)
    data
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
    np.diag(data)
    
    array([ 0,  5, 10, 15])
    
    np.trace(data)
    
    30
    
    np.linalg.det(data)
    
    -2.9582283945787796e-30
    
    np.linalg.eig(data)
    
    (array([ 3.24642492e+01, -2.46424920e+00,  1.92979794e-15, -4.09576009e-16]),
     array([[-0.11417645, -0.7327781 ,  0.54500164,  0.00135151],
            [-0.3300046 , -0.28974835, -0.68602671,  0.40644504],
            [-0.54583275,  0.15328139, -0.2629515 , -0.8169446 ],
            [-0.76166089,  0.59631113,  0.40397657,  0.40914805]]))
    
    np.linalg.inv(data)
    
    array([[ 9.00719925e+14, -4.50359963e+14, -1.80143985e+15,
             1.35107989e+15],
           [-2.40191980e+15,  2.70215978e+15,  1.80143985e+15,
            -2.10167983e+15],
           [ 2.10167983e+15, -4.05323966e+15,  1.80143985e+15,
             1.50119988e+14],
           [-6.00479950e+14,  1.80143985e+15, -1.80143985e+15,
             6.00479950e+14]])
    
    np.linalg.qr(data)
    
    (array([[ 0.        , -0.83666003,  0.48308786,  0.25812035],
            [-0.26726124, -0.47809144, -0.8365087 ,  0.01591196],
            [-0.53452248, -0.11952286,  0.22375381, -0.80618499],
            [-0.80178373,  0.23904572,  0.12966702,  0.53215267]]),
     array([[-1.49666295e+01, -1.65701970e+01, -1.81737645e+01,
             -1.97773319e+01],
            [ 0.00000000e+00, -1.19522861e+00, -2.39045722e+00,
             -3.58568583e+00],
            [ 0.00000000e+00,  0.00000000e+00, -1.71941189e-15,
             -5.12511879e-15],
            [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
             -8.82043219e-16]]))
    

    random模块

    # 生成数组,每次运行出来的数组都不一样
    np.random.rand(3,3)
    
    array([[0.93921666, 0.42365706, 0.84692929],
           [0.08043763, 0.19183508, 0.59509369],
           [0.10962175, 0.58845541, 0.47584158]])
    
    • np.random.seed() 生成随机数种子,如有参数,即每次生成的数值一样,没有则选择系统时间,每次生成的值不一样
    • np.random.rand() 均匀分布的样本值
    • np.random.randint() 从给定的上下限范围内随机选取整数
    • np.random.normal() 正太分布
    • np.random.uniform() [0,1]中均匀分布的样本值
    np.random.uniform(1,5,20)
    
    array([1.73527813, 4.37708175, 1.23993594, 3.11160917, 4.81709012,
           1.37763267, 4.08172748, 3.16229412, 4.83786832, 1.696155  ,
           2.17848768, 3.38546968, 3.34576086, 3.303562  , 1.16051986,
           3.37224742, 4.87527035, 2.48957213, 3.27498108, 1.46253374])
    
    np.random.uniform(20)
    
    6.760672905250747
    
    np.random.randint(0,2,10)
    
    array([0, 1, 1, 1, 1, 0, 1, 1, 0, 1])
    
    np.random.normal(1,5,10)
    
    array([-3.03222528,  1.00433415, -6.68152162, -7.8533515 , -3.10631387,
            4.76162682,  2.9385615 , -6.95958349, -5.98428693,  1.62605193])
    

    案例:酒鬼漫步

    原点启始,每走一步,方向不定,经过时间t后,计算酒鬼位置与原点位置的距离。

    假设走了2000步,每步0.5米,向前走一步+1,后退1步-1,计算与原点的距离,就是将所有的步数进行累计求合

    import numpy as np
    
    steps = 2000
    draws = np.random.randint(0,2,steps)
    # draws=0时,derection=1
    derection_steps = np.where(draws>0,1,-1)
    # 计算距离
    distance = derection_steps.cumsum()
    distance
    
    array([ -1,  -2,  -3, ..., -26, -25, -26])
    
    # 最大前进步数
    distance.max()
    
    39
    
    # 第几步最大
    distance.argmax()
    
    486
    
    distance.min()
    
    -55
    
    distance.argmin()
    
    1212
    
    # 第几步时,距离原点距离=15米
    dst = 15/0.5
    (np.abs(distance)>=dst).argmax()
    
    461
    
    
    
  • 相关阅读:
    【C++17】std::optional

    【GDB 】GDB基本命令
    【二叉树系列 | 01】二叉树遍历
    【coredump | 01】coredump的阐述
    【C++ Template | 06】std::enable_if和SFINAE
    std::dclval 使用教程
    系统设计实践(03)- Instagram社交服务
    系统设计实践(02)- 文本存储服务
    系统设计实践(01)
  • 原文地址:https://www.cnblogs.com/zheng1076/p/11453474.html
Copyright © 2020-2023  润新知