Python numpy数值计算基础

数组创建

  1. 创建数组对象 np.array(object, dtype,ndmin)

    • object: array-like ,接收的数组对象
    • dtype: 创建的数组的数据类型,默认为None
    • ndmin: 生成数组应有的最小维数,默认为None
    >>> li1=[1,2,3,4]
    >>> arr1=np.array(li1)
    >>> arr1
    array([1, 2, 3, 4])
    >>> li2=((1,2,3,4),(5,6,7,8))
    >>> arr2=np.array(li2)
    >>> arr2
    array([[1, 2, 3, 4],
        [5, 6, 7, 8]])
    
  2. 创建等差一维数组 np.arange([start,] stop ,[step],dtype)

    • start:起始值
    • stop:结束值
    • step:步长
    • dtype:元素的数据类型,默认为输入数据的类型
    >>> arr1=np.arange(10)
    >>> arr1
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> arr2=np.arange(3,5)
    >>> arr2
    array([3, 4])
    >>> arr3=np.arange(0,1,0.2)
    >>> arr3
    array([0. , 0.2, 0.4, 0.6, 0.8])
    

    也可以用linspace函数创建等差一维数组 np.linspace(start, stop, num, endpoint, retstep, dtype)

    • start:起始值
    • stop:结束值
    • num:产生的等差数组的元素个数
    • endpoint:为True则数据范围[start,stop],否则[start,stop),默认为True
    >>> arr1=np.linspace(1,5,5)
    >>> arr1
    array([1., 2., 3., 4., 5.])
    >>> arr2=np.linspace(1,5,5,endpoint=False)
    >>> arr2
    array([1. , 1.8, 2.6, 3.4, 4.2])
    
  3. 创建一维等比数组 np.logspace(start, stop, num, endpoint=True, base=10.0, dtype=None)

    • start:起始值,代表base的幂数
    • stop:结束值,代表base的幂数
    • num:产生的等差数组的元素个数
    • endpoint:为True则数据范围[start,stop],否则[start,stop),默认为True
    • base:底数,默认为10
    >>> arr1=np.logspace(0,1,5)  # 10^0 ~ 10^1 --> (1,10)
    >>> arr1
    array([ 1.        ,  1.77827941,  3.16227766,  5.62341325, 10.        ])
    >>> arr2=np.logspace(0,1,5,base=2.0) # 2^0 ~ 2^1 --> (1,2)
    >>> arr2
    array([1.        , 1.18920712, 1.41421356, 1.68179283, 2.        ])
    
  4. 创建全0数组 np.zeros(shape, dtype=float, order='C')

    • shape:数组的维数
    >>> arr1=np.zeros(3)
    >>> arr1
    array([0., 0., 0.])
    >>> arr2=np.zeros((3,2))
    >>> arr2
    array([[0., 0.],
        [0., 0.],
        [0., 0.]])
    
  5. 创建全1数组 np. ones(shape, dtype=None, order='C')

    • shape:数组的维数
    >>> arr1=np.ones((2,3))
    >>> arr1
    array([[1., 1., 1.],
        [1., 1., 1.]])
    
  6. 创建对角矩阵 np.diag(v, k=0)

    • v: array-like 对角矩阵的对角值
    >>> v = np.arange(4)
    >>> v
    array([0, 1, 2, 3])
    >>> arr1=np.diag(v)
    >>> arr1
    array([[0, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 2, 0],
        [0, 0, 0, 3]])
    

查看数组内容

  • ndim:数组的轴的个数,即数组的维数
  • size:数组的元素个数
  • dtype:数组的元素类型
  • shape:数组的形状
  • itemsize:数组中每个元素的大小(所占字节数)
>>> arr1
array([[0, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 2, 0],
       [0, 0, 0, 3]])
>>> arr1.ndim
2
>>> arr1.shape
(4, 4)
>>> arr1.size
16
>>> arr1.dtype
dtype('int32')
>>> arr1.itemsize
4
>>> 

数组变换

  1. 改变数组的shape np.reshape(a, newshape, order='C')
    • a:需要处理的数据
    • newshape:改变后的数组的形状,可以设置一个维度的大小为-1,则系统会自动计算改变后的newshape
    >>> arr1
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> arr1.reshape(2,-1)  # 自动计算 10*1/2 = 5 ,newshape = (2,5)
    array([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]])
    >>> np.reshape(arr1,(2,-1))
    array([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]])
    >>> arr1.reshape(5,2)
    array([[0, 1],
        [2, 3],
        [4, 5],
        [6, 7],
        [8, 9]])
    
  2. 数组扁平化 np.ravel(a)
    >>> arr1 = np.arange(12).reshape(3,-1)
    >>> arr1
    array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
    >>> arr1.ravel()
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    >>> 
    
  3. 数组合并 np.concatente(arr,axis)
    • arr:要合并的数组集合
    • axis:合并的轴,axis=0进行纵向合并,axis=1进行横向合并
    >>> arr1
    array([[1, 2],
        [3, 4]])
    >>> arr2
    array([[2, 4],
        [6, 8]])
    
    >>> np.concatenate((arr1,arr2),axis=0) #以x为轴,纵向合并
    array([[1, 2],
        [3, 4],
        [2, 4],
        [6, 8]])
    >>> np.concatenate((arr1,arr2),axis=1) #以y为轴,横向合并
    array([[1, 2, 2, 4],
        [3, 4, 6, 8]])
    
  4. 数组转置 T
    >>> a = np.arange(6).reshape(2,3)
    >>> a
    array([[0, 1, 2],
        [3, 4, 5]])
    >>> a.T
    array([[0, 3],
        [1, 4],
        [2, 5]])
    >>> 
    
  5. 数组划分 np.split(ary, indices_or_sections, axis=0)
    • ary:被划分的数组
    • indices_or_sections:int或1-D array,若为int则ary会被等划分为int份;若为1-D array则会在对应位置做切分 ,例如[2,3] --> [:2] + [2:3] + [3:]
    • axis: axis=0 则以x为轴,横向切割;若axis=1则纵向切割
    >>> a = np.arange(12).reshape(3,4)
    >>> a
    array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
    >>> p1,p2,p3=np.split(a,3,axis=0) # 横向等分为3份
    >>> p1
    array([[0, 1, 2, 3]])
    >>> p2
    array([[4, 5, 6, 7]])
    >>> p3
    array([[ 8,  9, 10, 11]])
    >>> p1,p2,p3=np.split(a,[1,3],axis=1) # 纵向切割为[:1] [1:3] [3:]
    >>> p1 # [:1]
    array([[0],
        [4],
        [8]])
    >>> p2 # [1:3]
    array([[ 1,  2],
        [ 5,  6],
        [ 9, 10]])
    >>> p3 # [3:]
    array([[ 3],
        [ 7],
        [11]])
    
  6. 数组中插入操作 np.insert(arr, obj, values, axis=None)
    • arr:被插入的数组
    • obj:int、slice或int序列 ,指定被插入的位置
    • values:array_like,被插入的值
    • axis:被插入的值,axis=0则横向插入, axis=1则纵向插入,若没有指定则会扁平化数组后插入
    >>> a = np.arange(16).reshape(4,4)
    >>> a
    array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
    >>> np.insert(a,1,axis=1,values=np.ones(4))  # 纵向插入 [1,1,1,1]
    array([[ 0,  1,  1,  2,  3],
        [ 4,  1,  5,  6,  7],
        [ 8,  1,  9, 10, 11],
        [12,  1, 13, 14, 15]])
    >>> np.insert(a,1,axis=1,values=2) #纵向插入 int自动填满
    array([[ 0,  2,  1,  2,  3],
        [ 4,  2,  5,  6,  7],
        [ 8,  2,  9, 10, 11],
        [12,  2, 13, 14, 15]])
    >>> np.insert(a,2,values=100) #不指定插入的轴,扁平化数组
    array([  0,   1, 100,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,
            12,  13,  14,  15])
    >>> np.insert(a,[1,3],axis=0,values=np.array(((-1,-1,-1,-1),(-2,-2,-2,-2)))) # 横向插入,插入1和3的位置,values为 2 array-like
    array([[ 0,  1,  2,  3],
        [-1, -1, -1, -1],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [-2, -2, -2, -2],
        [12, 13, 14, 15]])
    

数组切片与索引

对于多维数组,每个维度上都有一个切片或索引,各个维度之间使用 , 隔开。切片的使用方式同列表一致。

>>> arr =np.arange(12).reshape(3,4)
>>> arr
array([[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]])
>>> arr[:,1] # 取第1列
array([1, 5, 9])
>>> arr[0,1:3] # 取第0行,第1-2列元素
array([1, 2])  
>>> arr[0:2,1:3] # 取第0-1行,第1-2列元素
array([[1, 2],
    [5, 6]])
>>> arr[2,:] # 取第2行元素
array([ 8,  9, 10, 11])

通过数组的索引切片可以实现数组的差分,可以代替split函数

数组的运算

可以通过ufunc函数/通用函数直接对数值中的元素进行运算。包括四则运算、比较运算、逻辑运算。

>>> a = np.array([1,3,5])
>>> b = np.array([2,3,4])
>>> a<b  # 比较运算
[ True False False]
>>> a!=b
[ True False  True]
>>> a>b
[False False  True]
>>> a==b
[False  True False]

>>> a + b   # 四则运算
array([3, 6, 9])
>>> a - b
array([-1,  0,  1])
>>> a * b
array([ 2,  9, 20])
>>> a ** b
array([  1,  27, 625], dtype=int32) 

>>> np.any(a<b) # np.any代表or操作,对输入的bool数组取or操作,返回bool值
True
>>> np.all(a<b) # np.all代表and操作,对输入的bool数组取and操作,返回bool值
False
>>> 

可以利用 np.where(condition,x,y) 来实现条件逻辑运算,若满足条件则输出x,否则输出y;若没有指定x和y,则返回满足condition的坐标

>>> a= np.array([1,3,5,7,9,-1])
>>> np.where(a>4) # 没有指定x和y,返回坐标
(array([2, 3, 4], dtype=int64),)
# 指定x和y ,满足condition则返回x,否则返回y
>>> np.where([[True,False],[False,True]],[[1,2],[3,4]],[[11,12],[13,14]])
array([[ 1, 12],
       [13,  4]])
>>> 

常用统计函数

NumPy中提供了很多用于统计分析的函数,常见的有sum、mean、std、var、min和max等。
几乎所有的统计函数在针对二维数组的时候需要注意轴的概念。axis=0时表示沿着纵轴(x方向)进行计算,axis=1时沿横轴(y方向)进行计算。默认axis为None,此时会将数组扁平化再计算。常用统计函数包括mean() ,std() ,var() , max(),min()

>>> a = np.arange(16).reshape(4,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> a.mean() # 不指定axis,则计算所有元素的均值
7.5
>>> a.mean(axis=1) # 沿y轴计算mean
array([ 1.5,  5.5,  9.5, 13.5])
>>> a.std(axis=1)
array([1.11803399, 1.11803399, 1.11803399, 1.11803399])
>>> a.var(axis=1)
array([1.25, 1.25, 1.25, 1.25])
>>> a.max(axis=1)
array([ 3,  7, 11, 15])
>>> a.min(axis=1)
array([ 0,  4,  8, 12])
>>> 
posted @ 2021-02-02 17:26  海物chinono  阅读(189)  评论(0)    收藏  举报