• numpy使用数组进行数据处理


    numpy使用数组进行数据处理

    meshgrid函数

    理解:

    二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标?
    显而易见是6个:
    (1,7)(2,7)(3,7)
    (1,8)(2,8)(3,8)

    >>> import numpy as np#导入numpy
    >>> a=np.array([1,2,3])#创建一维数组
    >>> b=np.array([7,8])
    >>> res=np.meshgrid(a,b)#获取所有点的横坐标和纵坐标
    >>> res#返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值
    [array([[1, 2, 3],
           [1, 2, 3]]), array([[7, 7, 7],
           [8, 8, 8]])]
    

    生成坐标绘制图像:

    >>> import numpy as np
    >>> points=np.arange(-5,5,0.01)#从-5到5步长为0.01
    >>> xs,ys=np.meshgrid(points,points)
    >>> ys
    array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
           [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
           [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
           ...,
           [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
           [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
           [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])
    >>> z=np.sqrt(xs**2+ys**2)#函数的求值运算
    >>> z
    array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,
            7.06400028],
           [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
            7.05692568],
           [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
            7.04985815],
           ...,
           [7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,
            7.04279774],
           [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
            7.04985815],
           [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
            7.05692568]])
    >>> import matplotlib.pyplot as plt
    >>> plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()
    <matplotlib.image.AxesImage object at 0x00000000087D6EB8>
    <matplotlib.colorbar.Colorbar object at 0x000000000D8F4FD0>
    >>> plt.title("Image plot of $sqrt{x^2 + y^2}$ for a grid of values")
    Text(0.5, 1.0, 'Image plot of $\sqrt{x^2 + y^2}$ for a grid of values')
    >>>plt.show()
    

    将条件逻辑表述为数组运算

    根据cond中的值来对数组进行选取,如果cond中的值为True,那么就选择x中对应的值,否则就选择y中对应的值,比如cond[0]=True,那么result[0]处应当放置yarr[0]的值

    >>> xarr=np.array([1.1,1.2,1.3,1.4,1.5])
    >>> yarr=np.array([2.1,2.2,2.3,2.4,2.5])
    >>> cond=np.array([True,False,True,True,False])
    >>> result=[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
    >>> result
    [1.1, 2.2, 1.3, 1.4, 2.5]
    

    where方法

    使用矢量

    where方法可以取代上面的写法

    >>> result=np.where(cond,xarr,yarr)
    >>> result
    array([1.1, 2.2, 1.3, 1.4, 2.5])
    

    使用标量

    np.where的第二个和第三个参数不必是数组,它们都可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。假设有一个由随机数据组成的矩阵,你希望将所有正值替换为2,将所有负值替换为-2。若利用np.where,则会非常简单:

    >>> arr=np.random.randn(4,4)
    >>> arr
    array([[-0.02461196, -0.11867552,  0.49004256, -0.25236766],
           [ 1.66484493, -0.41180743, -0.34837293, -2.61422661],
           [ 0.51476568, -0.41451909,  1.28553372,  0.13866799],
           [-0.94795594, -1.49302099,  1.18480636,  0.20310613]])
    >>> arr>0
    array([[False, False,  True, False],
           [ True, False, False, False],
           [ True, False,  True,  True],
           [False, False,  True,  True]])
    >>> np.where(arr>0,2,-2)
    array([[-2, -2,  2, -2],
           [ 2, -2, -2, -2],
           [ 2, -2,  2,  2],
           [-2, -2,  2,  2]])
    

    标量矢量结合

    如果对应位置是True,那么新的数组对应位置为2,否则就还是原来的数值

    >>> np.where(arr>0,2,arr)
    array([[-0.02461196, -0.11867552,  2.        , -0.25236766],
           [ 2.        , -0.41180743, -0.34837293, -2.61422661],
           [ 2.        , -0.41451909,  2.        ,  2.        ],
           [-0.94795594, -1.49302099,  2.        ,  2.        ]])
    

    数学统计方法

    mean函数

    对所有的元素求均值

    >>> import numpy as np
    >>> arr=np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>> arr.mean()
    5.0
    
    >>> np.mean(arr)
    5.0
    

    sum函数

    对所有元素求和

    >>> arr.sum()
    45
    

    可选轴求值

    >>> arr.mean(axis=1)#列求平均值
    array([2., 5., 8.])
    >>> arr.mean(axis=0)#行求平均值
    array([4., 5., 6.])
    >>> arr.sum(axis=0)
    array([12, 15, 18])#行求和
    >>> arr.sum(axis=1)
    array([ 6, 15, 24])#列求和
    

    cumsum函数

    1.对于一维输入a(可以是list,可以是array,假设a=[1, 2, 3, 4, 5, 6, 7] ,就是当前列之前的和加到当前列上,如下:

    >>>import numpy as np
    >>> a=[1,2,3,4,5,6,7]
    >>> np.cumsum(a)
    array([  1,   3,   6,  10,  15,  21,  28,  36,  45,  55,  75, 105])
    

    2.对于二维输入a,axis=0(第1行不动,将第1行累加到其他行);axis=1(进入最内层,转化成列处理。第1列不动,将第1列累加到其他列),如下:

    >>>import numpy as np
    >>> c=[[1,2,3],[4,5,6],[7,8,9]]
    >>> np.cumsum(c,axis=0)
    array([[ 1,  2,  3],
           [ 5,  7,  9],
           [12, 15, 18]])
    >>> np.cumsum(c,axis=1)
    array([[ 1,  3,  6],
           [ 4,  9, 15],
           [ 7, 15, 24]])
    

    cumprod函数

    累乘方法同理

    >>> arr.cumprod(axis=1)
    array([[  1,   2,   6],
           [  4,  20, 120],
           [  7,  56, 504]], dtype=int32)
    

    布尔数组的方法

    sum方法

    >>> import numpy as np
    >>> arr=np.random.randn(100)
    >>> arr>0
    array([ True,  True, False,  True,  True,  True,  True,  True,  True,
           False,  True, False, False,  True,  True,  True, False,  True,
            True, False, False,  True,  True,  True, False, False,  True,
            True, False,  True,  True,  True, False, False,  True, False,
            True, False, False,  True, False, False,  True, False, False,
            True, False,  True,  True, False,  True,  True,  True, False,
           False, False, False,  True,  True,  True,  True, False,  True,
           False, False,  True, False, False,  True,  True,  True, False,
            True, False, False, False,  True, False,  True,  True,  True,
            True, False, False, False, False, False, False, False,  True,
           False, False,  True, False, False, False,  True, False,  True,
           False])
    >>> (arr>0).sum()
    51
    >>>
    

    any方法

    any用于测试数组中是否存在一个或多个True

    >>> bools=np.array([False,False,True,True])
    >>> bools.any()
    True
    

    all方法

    all则检查数组中所有值是否都是True

    >>> bools.all()
    False
    

    排序

    一维数组

    >>> arr=np.random.randn(6)
    >>> arr
    array([-1.55689999,  0.59917555,  0.09981181, -0.74146468,  0.48666154,
           -1.06564002])
    >>> arr.sort()
    >>> arr
    array([-1.55689999, -1.06564002, -0.74146468,  0.09981181,  0.48666154,
            0.59917555])
    >>> 
    

    多维数组

    多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可:

    >>> arr=np.random.randn(5,3)
    >>> arr
    array([[ 0.26943933,  1.2985981 ,  0.24338663],
           [ 0.22550084, -0.03952026,  0.32522357],
           [-1.96626749, -0.14959244,  1.19403458],
           [-0.14429635,  1.42566274, -1.13627841],
           [ 1.00049286, -0.44634922, -0.59281931]])
    >>> arr.sort(1)
    >>> arr
    array([[ 0.24338663,  0.26943933,  1.2985981 ],
           [-0.03952026,  0.22550084,  0.32522357],
           [-1.96626749, -0.14959244,  1.19403458],
           [-1.13627841, -0.14429635,  1.42566274],
           [-0.59281931, -0.44634922,  1.00049286]])
    >>> arr.sort(0)
    >>> arr
    array([[-1.96626749, -0.44634922,  0.32522357],
           [-1.13627841, -0.14959244,  1.00049286],
           [-0.59281931, -0.14429635,  1.19403458],
           [-0.03952026,  0.22550084,  1.2985981 ],
           [ 0.24338663,  0.26943933,  1.42566274]])
    

    顶级方法np.sort返回的是数组的已排序副本,而就地排序则会修改数组本身。

    唯一化以及其它的集合逻辑

    unique方法

    去重加上排序

    >>> names=np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
    >>> np.unique(names)
    array(['Bob', 'Joe', 'Will'], dtype='<U4')
    >>> values=np.array([6, 0, 0, 3, 2, 5, 6])
    >>> np.unique(values)
    array([0, 2, 3, 5, 6])
    

    in1d方法

    测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组

    >>> values = np.array([6, 0, 0, 3, 2, 5, 6])
    >>> np.in1d(values,[2,3,6])
    array([ True, False, False,  True,  True, False,  True])
    

    6在2,3,6中,0没在2,3,6中,依次类推

    数组集合运算

  • 相关阅读:
    队列<一>
    二叉树的遍历[先序,中序,后序]
    The method format(String, Object[]) in the type String is not applicable for the arguments
    sqlserver 备份 与 还原
    sqlserver 无法获得数据库独占权
    page.isvalid
    bzoj3994 [SDOI2015]约数个数和
    bzoj4868 [Shoi2017]期末考试
    bzoj1179 [Apio2009]Atm
    bzoj4869 [Shoi2017]相逢是问候
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11620764.html
Copyright © 2020-2023  润新知