您的位置:首页 > 编程语言

NumPy使用教程(三)面向数组编程

2019-05-04 17:46 127 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/FlashKoala/article/details/89815929

NumPy - 面向数组编程 目录树

  • 常用数组函数
  • 矩阵运算
  • 总结
  • NumPy使用教程(三)面向数组编程
    来自http://www.tpleina.com/2019/05/3281302163.html

    面向数组编程

    NumPy数组通过简单的数组表达式完成多种数据操作任务,数组表达式代替循环的方法称之为向量化

    numpy.where

    numpy.where
    函数是三目运算
    x if condition else y
    的数组版

    使用示例

    条件+数组+数组形式

    import numpy as np
    
    arr1 = np.random.randn(6)
    arr2 = np.random.randn(6)
    cond = np.array([True,True,True,False,False,False])
    print(arr1)
    print(arr2)
    arr3 = np.where(cond, arr1, arr2)
    print(arr3)
    # 输出
    [ 1.27341434  0.98277035 -0.37508696 -0.10692764  0.61461728 -0.49524537]
    [-0.17197977 -1.54415347  2.10698458 -0.59802743 -0.39001325  1.29582979]
    [ 1.27341434  0.98277035 -0.37508696 -0.59802743 -0.39001325  1.29582979]

    条件+标量+数组形式

    import numpy as np
    
    arr = np.random.randint(-50,50,(4,5))
    print(arr)
    t_num = 10
    arr1 = np.where(arr>0, t_num, arr)
    print(arr1)
    # 输出
    [[-17  29 -39 -42  28]
    [ 32  33  49  22  47]
    [-22 -36  10  11  24]
    [ 30 -29  -1  40 -27]]
    [[-17  10 -39 -42  10]
    [ 10  10  10  10  10]
    [-22 -36  10  10  10]
    [ 10 -29  -1  10 -27]]

    条件+标量+标量形式

    import numpy as np
    
    arr = np.random.randint(-50,50,(4,5))
    print(arr)
    t_num = 10
    f_num = -10
    arr1 = np.where(arr>0, t_num, f_num)
    print(arr1)
    # 输出
    [[ 18  47 -16 -50  31]
    [ 34 -39  38 -47 -41]
    [  4 -20  41  37  23]
    [-15 -48  12 -32 -34]]
    [[ 10  10 -10 -10  10]
    [ 10 -10  10 -10 -10]
    [ 10 -10  10  10  10]
    [-10 -10  10 -10 -10]]

    数组统计函数

    • sum
      沿着轴向,计算所有元素累积和
    • mean
      算数平均数
    • std
      var
      标准差、方差
    • min
      max
      最大值、最小值
    • argmin
      argmax
      最大和最小元素的位置
    • cumsum
      从0开始元素累积和
    • cumprod
      从1开始元素累积和

    以上方法都可传入axis参数,表示某个轴线方向操作:0轴表示行,1轴表示列

    数组统计函数使用示例

    import numpy as np
    
    arr1d = np.random.randint(1,50,10)
    arr2d = np.random.randint(1,50,(4,5))
    print(arr1d.sum())
    print(arr2d)
    # 行的累积和
    print(arr2d.sum(axis=1))
    # 列的累积和
    print(arr2d.sum(axis=0))
    # 所有元素累积和
    print(arr2d.sum())
    
    # 行的平均值
    print(arr2d.mean(axis=1))
    # 列的平均值
    print(arr2d.mean(axis=0))
    # 所有元素平均值
    print(arr2d.mean())
    
    # 行的最大值
    print(arr2d.max(axis=1))
    # 列的最大值
    print(arr2d.max(axis=0))
    # 所有元素最大值
    print(arr2d.max())
    
    # 行的最大位置
    print(arr2d.argmax(axis=1))
    # 列的最大位置
    print(arr2d.argmax(axis=0))
    # 所有元素最大位置
    print(arr2d.argmax())

    排序

    数组通过

    np.sort
    实现对数组的排序

    import numpy as np
    a1 = np.floor(10*np.random.random((4,4)))
    print a1
    # 按照行维度排序
    a1.sort(axis=1)
    np.sort(a1, axis=1)
    print a1
    # 按照列维度排序
    a1.sort(axis=0)
    np.sort(a1, axis=0)
    print a1

    针对多维数组,可传入axis参数,按照某个轴线方向排序:0轴表示行,1轴表示列

    布尔数组使用

    布尔值会被强制转换为1(True)和0(False),因此sum可以统计布尔数组中True的个数

    import numpy as np
    arr = np.random.randn(100)
    # 统计正数的个数
    res = (arr>0).sum()
    print(res)
    • np.any
      检查数组至少有一个True
    • np.all
      检查数组每个元素都为True
    import numpy as np
    
    arr = np.random.randint(-50,50,10)
    arr1 = arr>0
    print(arr1)
    print(arr1.any())
    print(arr1.all())

    数组唯一值

    • unique(x)
      计算x中的唯一元素,并返回有序结果
    • intersect1d(x, y)
      计算x和y的公共元素,并返回有序结果
    • union1d(x, y)
      计算x和y的并集,并返回有序结果
    • in1d(x, y)
      得到一个表示x的元素是否包含于y的布尔数组
    • setdiff1d(x, y)
      集合的差,即元素在x中且不在
    • setxor1d(x, y)
      集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素
    arr = np.array([3, 3, 2, 2, 1, 1, 4])
    # 消重、排序输出
    >>np.unique(arr)
    array([1, 2, 3, 4])
    # 等价于
    >> sorted(set(arr))
    array([1, 2, 3, 4])
    # np.in1d 数组arr那些元素存在于第二个数组中,并返回布尔数组
    >> np.in1d(arr, [2, 3, 6])
    array([True, True, True, True, False, False, False])

    常用数组函数

    常用函数能对ndarray对象逐元素扫描操作

    一元函数,接收一个参数,并返回一个数组结果。有:

    • abs
      fabs
      计算数组元素绝对值
    • sqrt
      计算数组元素平方根
    • square
      计算数组元素平方
    • exp
      计算数组元素指数
    • log
      log10
      log2
      log1p
      分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x)
    • sign
      计算数组元素正负号
    • ceil
      计算数组元素ceiling值,即大于等于该值的最小整数
    • floor
      计算数组元素floor值,即小于等于该值的最大整数
    • rint
      计算数组元素值四舍五入到最接近的
    • modf
      将数组的小数和整数部分以两个独立的数组形式返回
    • isnan
      “哪些值是NaN” 返回布尔值
    • isfinite
      isinf
      “哪些元素是有穷的” “哪些元素是无穷的”
    • cos
      cosh
      sin
      sinh
      tan
      tanh
      普通型和双曲型三角函数
    • arccos
      arccosh
      arcsin
      arcsinh
      arctan
      arctanh
      反三角函数

    二元函数,接收两个参数,并返回一个数组结果。有:

    • add
      两个数组对应元素相加
    • subtract
      两个数组对应元素做减法
    • multiply
      数组元素相乘
    • divide
      floor_divide
      数组元素整除
    • power
      数组元素的n次方
    • maximum
      fmax
      获取数组元素最大值,fmax将忽略nan
    • minimum
      fmin
      获取数组元素最小值,fmin将忽略nan
    • mod
      元素级的求模计算
    • copysign
      将第一个数组的符号值改为第二个数组的符号值
    • greater
      greater_equal
      less
      less_equal
      equal
      not_equal
      数组元素比较运算,产生布尔型数组
    • logical_and
      logical_or
      logical_xor
      数组元素元素间与或运算

    同时数组函数都可接受一个可选参数out,用于对数组进行按位操作

    矩阵运算

    首先说一下什么是矩阵,矩阵是数组的一个子集,数组可以有多维,一维、二维、三维、多维等,其中二维数组被称为矩阵

    矩阵计算函数有:

    • diag 将一个方阵的对角元素作为一维数组返回,或将一维数组转换成一个方阵,并且在非对角线为0点
    • dot 矩阵点乘
    • trace 计算对角线元素和
    • det 计算矩阵行列式
    • eig 计算方阵的特征值和特征向量
    • inv 计算方阵的逆矩阵
    • pinv 计算矩阵的Moore-Penrose伪逆
    • qr 计算QR分解
    • svd 计算奇异值分解(SVD)
    • solve 解线性方程组Ax = b, 其中A为一个方阵
    • lstsq 计算Ax = b的最小二乘解

    额外说一下:矩阵点乘 使用

    np.dot
    实现的,而运算符
    *
    是对数组逐元素乘积,千万不要跟矩阵点乘搞混!

    总结

    本节主要介绍NumPy 面向数组编程内容,涉及到NumPy大量函数,针对这些函数的使用额外补充一点:
    除了可以这样

    arr.func
    调用函数,也可以通过
    numpy.func
    方式调用NumPy提供的函数!

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: