zoukankan      html  css  js  c++  java
  • Numpy的进阶学习

    前言:

    在学习cs231n编写课后作业代码过程中 。发现自己对计算的向量化vectorized不是很懂,编写不出代码。对numpy的库也只是停留在表面

    Numpy

    Numpy学习库链接

    1.numpy 求解方程组

    $Ax=b $ 求解 (x=A^{-1}b)

    import numpy as np
    np.linalg.slove(A,b)
    
    # example
    A=np.array([[1,2,3],[4,5,6]])
    b=np.transpose(np.array([[2,1]]))
    x=np.linalg.slove(A,b)
    

    2.多元线性回归

    最简单的最小二乘线性回归

    寻找一个向量B可以使得 XB接近于y
    (y=X* eta)
    $ eta= (X{T}X){-1} X^{T}y $

    Xt = np.transpose(X)
    XtX = np.dot(Xt,X)
    Xty = np.dot(Xt,y)
    beta = np.linalg.solve(XtX,Xty)
    

    一个实践案例,项目

    import csv
    import numpy as np
    
    def readData():
        X = []
        y = []
        with open('Housing.csv') as f:
            rdr = csv.reader(f)
            # Skip the header row
            next(rdr)
            # Read X and y
            for line in rdr:
                xline = [1.0]
                for s in line[:-1]:
                    xline.append(float(s))
                X.append(xline)
                y.append(float(line[-1]))
        return (X,y)
    
    X0,y0 = readData()
    # Convert all but the last 10 rows of the raw data to numpy arrays
    d = len(X0)-10
    X = np.array(X0[:d])
    y = np.transpose(np.array([y0[:d]]))
    
    # Compute beta
    Xt = np.transpose(X)
    XtX = np.dot(Xt,X)
    Xty = np.dot(Xt,y)
    beta = np.linalg.solve(XtX,Xty)
    print(beta)
    
    # Make predictions for the last 10 rows in the data set
    for data,actual in zip(X0[d:],y0[d:]):
        x = np.array([data])
        prediction = np.dot(x,beta)
        print('prediction = '+str(prediction[0,0])+' actual = '+str(actual))
    

    3.Numpy的操作运算

    # 创建一个bool数组
    np.full((5,5),True,dtype=bool)
    
    np.ones((3,3),dtype=bool)
    
    # 不影响原始数组的情况下替换满足条件的元素项
    
    arr = np.arange(10)
    out = np.where(arr % 2 == 1, -1, arr)
    print(arr)
    out
    # > [0 1 2 3 4 5 6 7 8 9]
    array([ 0, -1,  2, -1,  4, -1,  6, -1,  8, -1])
    
    # 数组的连接
    >>> a=np.arange(10).reshape(2,-1)
    >>> b=np.repeat(1,10).reshape(2,-1)
    >>> a
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    >>> b
    array([[1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1]])
    >>> np.vstack([a,b])
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9],
           [1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1]])
    np.r_[a, b]                               # 垂直方向上的连接
    # > array([[0, 1, 2, 3, 4],
    # >        [5, 6, 7, 8, 9],
    # >        [1, 1, 1, 1, 1],
    # >        [1, 1, 1, 1, 1]])
    >>> np.hstack([a,b])
    array([[0, 1, 2, 3, 4, 1, 1, 1, 1, 1],
           [5, 6, 7, 8, 9, 1, 1, 1, 1, 1]])
    np.c_[a, b]                             # 水平方向上的连接
    # > array([[0, 1, 2, 3, 4, 1, 1, 1, 1, 1],
    # >        [5, 6, 7, 8, 9, 1, 1, 1, 1, 1]])
    >>> np.concatenate([a,b],axis=0)
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9],
           [1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1]])
    >>> np.concatenate([a,b],axis=1)
    array([[0, 1, 2, 3, 4, 1, 1, 1, 1, 1],
           [5, 6, 7, 8, 9, 1, 1, 1, 1, 1]])
    
    # 数组元素的重复&数组的重复
    a=np.array([1,2,3])
    np.repeat(a,3)       # repeat elements of the array
    np.tile(a,3)            # Construct an array by repeating A the number of times given by reps.(3)
    np.r_[np.repeat(a, 3), np.tile(a, 3)]
    # > array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])
    

    Numpy的矢量化

    numpy的数组编程最重要就是numpy的矢量化
    矢量化:

    • 矢量化是NumPy中的一种强大功能,可以将操作表达为在整个阵列上而不是在各个元素上发生
    • 这种用数组表达式替换显式循环的做法通常称为向量化
    • 矢量化数组操作通常比其纯Python等价物快一个或两个(或更多)数量级,在任何类型的数值计算中都具有最大的影响
    • NumPy中的向量化操作将内部循环委托给高度优化的C和Fortran函数,从而实现更清晰,更快速的Python代码。

    数组的广播计算

    [:, None]是一种扩展数组维度的方法,用于创建长度为1的轴

    >>> sample=np.random.normal(loc=[2.,20.],scale=[1.,3.5],size=(3,2))
    >>> sample
    array([[ 1.90805008, 14.87827272],
           [ 3.08179168, 19.16236191],
           [ 1.50887086, 16.49204796]])
    >>> sample.min(axis=1)
    array([1.90805008, 3.08179168, 1.50887086])
    >>> sample.min(axis=1)[:,None]
    array([[1.90805008],
           [3.08179168],
           [1.50887086]])
    
  • 相关阅读:
    SQL反模式学习笔记16 使用随机数排序
    SQL反模式学习笔记21 SQL注入
    SQL反模式学习笔记22 伪键洁癖,整理数据
    SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
    SQL反模式学习笔记19 使用*号,隐式的列
    SQL反模式学习笔记17 全文搜索
    SQL反模式学习笔记20 明文密码
    (可发送)亿级流量APP,是怎么做前端性能测试自动化的?
    测试窝 高薪测试必备技能和 20+ 项目实战精华,好书免费领(限前 1000 名)!
    同样是断言,为何 Hamcrest 如此优秀?测试灵魂三问,该如何回答?
  • 原文地址:https://www.cnblogs.com/GeekDanny/p/10458885.html
Copyright © 2011-2022 走看看