zoukankan      html  css  js  c++  java
  • python科学计算_numpy_函数库

    1.常规函数与排序

    常用统计函数:

    求和:sum()、均值:mean()、标准差:std()、方差:var()、最小值:min()、最大值:max()、最大值与最小值之差:ptp()、最大值的下标:argmax()、最小值的下标:argmin()、中值:median()

    上述函数都可以指定axis,来沿着某一轴操作;除了mean()函数求均值,还可以使用average(),并且可以指定weights参数来指定权值,计算加权平均;argmax()和argmin()如果不指定axis参数,则返回平坦化后的下标;

    排序函数:sort()、argsort();数组的sort()方法会对数组本身进行改变,而sort()函数则不会;sort默认axis=-1,即沿着最后一个轴进行排序;sort()函数返回一个新的排序后的数组而argsort()则返回排序后的下标数组,如:

    import numpy as np
    a = np.random.randint(0,10,size=(4,5))

    array([[8, 2, 0, 3, 7],
    [7, 0, 2, 7, 4],
    [1, 8, 1, 1, 2],
    [4, 6, 2, 1, 4]])

    a.sort()   #此时a数组会改变为排序后的数组;

    a1 = np.sort(a)   #此时a数组不变,得到的a1数组为:

    array([[0, 2, 3, 7, 8],
    [0, 2, 4, 7, 7],
    [1, 1, 1, 2, 8],
    [1, 2, 4, 4, 6]])

    # 即沿着-1轴排序后的结果

    idx = np.argsort(a) 

    idx

    array([[2, 1, 3, 4, 0],
    [1, 2, 4, 0, 3],
    [0, 2, 3, 4, 1],
    [3, 2, 0, 4, 1]])

    此时,虽然idx.shape = (4,5),但是并不能直接使用a[idx]得到排序后的数组,因为idx是数组,所以numpy会在后面补:,等效于:a[idx,:],idx数组中的每个值访问a数组的0轴,当idx中的值超过a的0轴长度之后就会产生错误:IndexError: index 4 is out of bounds for axis 0 with size 4;所以使用idx来访问a得到排序后的数组,需要产生0轴的下标,通过np.ogrid对象可以生成:

    x,_ = np.ogrid[:a.shape[0],:a.shape[1]]

    右边的表达式生成a数组的grid,即各个轴的下标数组,取第一个元素即得到a数组的0轴下标数组:

    array([[0],
    [1],
    [2],
    [3]])

    通过a[x,idx]可以正确访问到排序后的数组

    2. 多项式函数

    多项式函数是只包含加法和乘法,对一个变量的各次幂进行加法和乘法操作的函数:

    f(x) = a[n]*x^n + a[n-1]*x^(n-1) + … + a[2]*x^2 + a[1]*x + a[0]

    numpy中通过将变量x的各次幂(从高到底的顺序)系数即可表示一个多项式函数:

    a = np.array([1.0,0,-2,1])

    p = np.poly1d(a)

    p是一个poly1d对象,此对象可以像函数一样调用,并且返回多项式的值,并且是一个ufunc对象,即可以以数组作为参数,得到相应的多项式值的数组;

    poly1d对象可以进行四则运算,分别对应于多项式的四则运算,除法运算时,会返回包含两个值的元组,其中第一个值为商多项式(商式),第二个值为余数多项式(余式);

    poly1d对象可以进行积分:deriv()和微分:integ()操作,得到新的多项式;

    使用np.roots()函数,可以对多项式进行求根:

    r = np.roots(p)

    array([-1.61803399,  1.        ,  0.61803399])

    使用np.poly()函数,可以将根转回多项式的系数:

    np.poly(r)

    array([ 1.00000000e+00, -1.22124533e-15, -2.00000000e+00,
    1.00000000e+00])

    使用np.polyfit()函数,可以对一组数据进行多项式拟合:

    import matplotlib.pyplot as plt
    plt.figure(figsize=(8,4))
    for deg in [3,5,7]:
        a = np.polyfit(x,y,deg)
        error = np.abs(np.polyval(a,x)-y)
        plt.plot(error)
    plt.ylim(0,0.0001)
    plt.show()

    NewImage 

    3.分段函数

    通过三个函数实现分段操作:where()、select()、piecewise()

    where(condition,x,y)函数类似于三目操作符,当condition为真时,返回x,否则返回y;如果x和y的形状不一致,则通过广播统一形状;

    当分段的数量比较多时,where()函数写起来就比较复杂,select(condlist, choicelist)函数,通过一个长度为N的布尔数组列表,choicelist则是一个长度为N的存储候选值的数组列表,其中所有数组长度为M;

    condlist可以形象地理解为多个分段的条件,N为分段的数量;choicelist则是每种条件下的取值,用if-elif-else表现为:

    if condlist[0] :
        choicelist[0]
    elif condlist[1]:
        choicelist[1]
    elif condlist[2]:
        choicelist[2]

    等;

    piecewise(x, condlist, funclist)函数是为了避免当分段比较多时,需要用很多的数组来存储分段结构,piecewise()函数可以直接通过分段列表计算出结果,而不需要中间的分段数组;和select()参数不同的是,funclist是一个函数列表,分别对应condlist中的条件执行;

    4.统计函数

    unique()函数返回参数数组中所有不同的值,并按照从小到大排序,相当于linux中的sort -u 命令;该函数有两个可选参数:

    return_index: True 表示同时返回原始数组的下标;

    return_inverse :True 表示同时返回重建原始数组用的下标数组;

    bincount()函数统计整数数组中各个元素出现的次数(参数数组中所有的元素必须为非负数),返回数组中的第i个元素表示整数i在参数数组中出现的个数。

    histogram(a, bins=10, range=None, normed=False, weights=None)函数对一维数组进行直方图统计;该函数返回两个一维数组:hist和bin_edges;

    histogram2d()、histogramdd()对二维数组和n维数组进行直方图统计


     

     

  • 相关阅读:
    宅急送
    网站迁移主要工作完成
    服务器迁移后性能提升很明显
    Vista修改默认字体
    服务器迁移预告
    Silverlight 2 和 Deep Zoom
    Mix 08到来之前的Monolight Update
    ASP.NET MVC Preview生命周期分析
    Windows Server 2008 与 .NET Framework 的版本之间有什么关系
    Silverlight 2 DispatcherTimer和通过XAML创建UI元素
  • 原文地址:https://www.cnblogs.com/lyon2014/p/4738196.html
Copyright © 2011-2022 走看看