美文网首页
2021-12-30 Python-22

2021-12-30 Python-22

作者: MaggieXie | 来源:发表于2021-12-30 15:46 被阅读0次
    1. 数组的转置和换轴
    #(1)对于二维数组而言,可以直接用T属性对换行列,得到原数据的拷贝
    import numpy as np
    arr=np.arange(12).reshape(3,4)
    arr.T
    #(2)对于更高维度的数组,可以用transpose方法进行转置,得到原数据的拷贝
    arr_1=np.arange(24).reshape(2,3,4)
    arr_1.transpose(1,0,2)
    '''
    array([[[ 0,  1,  2,  3],
            [12, 13, 14, 15]],
    
           [[ 4,  5,  6,  7],
            [16, 17, 18, 19]],
    
           [[ 8,  9, 10, 11],
            [20, 21, 22, 23]]])
    '''
    '''
    transpose方法中的参数相当于是shape的索引,shape原先的索引是(0,1,2)现在相当于把第一个维度和第二个维度进行了交换。
    比如1这个元素,原来的维度是(0,0,1),转置后仍然是(0,0,1),位置不变
    再比如4这个元素,原来的维度是(0,1,0),转置后是(1,0,0),所以最后的位置在第一维度(0,0)的位置。
    '''
    #(3)swapaxes函数接受一对轴编号作为参数,将两个轴互换,得到原数据的视图
    arr_1.swapaxes(0,1)
    array([[[ 0,  1,  2,  3],
            [12, 13, 14, 15]],
    
           [[ 4,  5,  6,  7],
            [16, 17, 18, 19]],
    
           [[ 8,  9, 10, 11],
            [20, 21, 22, 23]]])
    
    
    1. 条件逻辑作为数组操作
      之前有提到过列表推导式
      [expr for val in collection if condition]
      对数组的操作也可以通过列表推导式
    #挑选a,b中数值大的元素组成新的列表
    a=np.random.randn(6)
    a
    '''
    array([-0.12981609, -0.08394044,  0.11156267,  0.12579888,  0.31244508,  1.56267388])
    '''
    b=np.random.randn(6)
    b
    '''
    array([-1.92307751, -0.962841  ,  1.21632673, -1.01466381, -1.22601677,  0.91981704])
    '''
    c=a>b
    c
    '''
    array([ True,  True, False,  True,  True,  True])
    '''
    result=np.array[(a1 if c1 else b1) for a1,b1,c1 in zip(a,b,c)]
    '''
    array([-0.12981609, -0.08394044,  1.21632673,  0.12579888,  0.31244508,  1.56267388])
    '''
    
    

    这种推导式在数组很大时会占用很大内存,并且对于多维数组不奏效。
    上述的代码也可以用np.where实现,np.where(condition,[x,y])

    result=np.where(c,a,b)
    #相当于判断c中每个元素是否为True,如果True则选取a中的元素,False选取b中的元素,最后组成和c形状相同的数组
    
    #如果c为多维数组
    np.where([[True,False], [True,True]],[[1,2], [3,4]],[[9,8], [7,6]])
    '''
    array([[1, 8],
           [3, 4]])
    '''
    #其实相当于先用了3个数组用了zip函数,组成了[[(True,1,9),(False,2,8)],[True,3,7],[True,4,6]],索引为(0,0)的元素,因为条件为True,所以选择了1
    
    #用法中的x和y均为可选变量,并且变量类型可以为数组,也可以为标量
    a
    #array([-0.12981609, -0.08394044,  0.11156267,  0.12579888,  0.31244508,  1.56267388])
    np.where(a>0)
    # (array([2, 3, 4, 5], dtype=int64),) 返回的是a中符合条件的索引
    a[np.where(a>0)]
    # array([0.11156267, 0.12579888, 0.31244508, 1.56267388])
    #相当于a[a>0]
    
    np.where(a>0,2,-2) #对>0的元素赋值为2,<0赋值为-2
    #array([-2, -2,  2,  2,  2,  2])
    
    
    1. 数组统计方法
      对数组进行统计运算时,可以使用数组的方法,也可以用numpy内置函数。
    a.mean() #调用数组方法
    np.mean(a) #调用numpy内置函数
    

    除了对全部元素进行计算外, 可以指定特定的轴

    dimension2=np.random.randn(2,4)
    dimension2
    '''
    array([[-0.08200293,  2.11290504,  0.95584747, -0.50603455],
           [ 1.40965591, -1.66446611, -0.26237453, -0.04456781]])
    '''
    np.mean(dimension2,axis=0)
    '''array([ 0.66382649,  0.22421947,  0.34673647, -0.27530118])''''
    #axis=0是行轴向,axis=1是列轴向
    dimension2.sum(1)
    #array([ 2.48071503, -0.56175254])
    arr1=np.random.randn(2,4)
    arr1.sort(axis=1) #返回对原数据的拷贝
    np.sort(arr1,axis=1) #返回原数据的视图
    

    布尔数组还有很多很好的用法

    arr=np.random.randn(100)
    (arr>0).sum() #55 统计其中True的数量
    bools=np.array([True,False,False])
    bools.any() #True 判断是否含有True
    bools.all() #False 判断是否均为True
    
    

    如果是非布尔数组,所有的非0元素均为True

    1. 数组的集合操作
      针对一维的数组,有一些基础的集合操作
    arr2=np.array(['a','c','ab','e','a','b','ef'])
    np.unique(arr2)
    #array(['a', 'ab', 'b', 'c', 'e', 'ef'], dtype='<U2') 返回数组中的唯一值并且经过排序
    #等价于
    sorted(set(arr2))
    
    values=np.array([6,0,0,3,2,5,6])
    np.in1d(values,[2,3,6])
    #array([ True, False, False,  True,  True, False,  True])
    #逐一比较前者列表/数组中的元素是否在另外一个数组中/列表中,并返回布尔值数组
    
    np.intersect1d(values,[2,3,6])
    #array([2, 3, 6]) 取交集并排序
    
    np.in1d(values,[2,3,6])
    # array([ True, False, False,  True,  True, False,  True]) 是否为包含关系
    
    np.union1d(values,[2,3,6])
    #array([0, 2, 3, 5, 6]) 取并集并排序
    
    

    相关文章

      网友评论

          本文标题:2021-12-30 Python-22

          本文链接:https://www.haomeiwen.com/subject/rjidqrtx.html