Numpy学习-1

作者: 茶苯海 | 来源:发表于2017-02-27 17:13 被阅读130次

    Numpy学习-1

    数组基础

    • 创建数组

      1 .一维数组的创建

    #导入模块
    import numpy as np
    
    #使用array()函数创建数组,array的首个参数一定是一个序列,可以是元组也可以是列表。
    ls1 = range(10)
    list(ls1)
    
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    type(ls1)
    
    range
    
    #使用numpy中的arange()函数创建一维有序数组
    ls2 = np.arange(10)
    list(ls2)
    
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    type(ls2)
    
    numpy.ndarray
    

    从上看出:使用array()函数创建数组,array的首个参数一定是一个序列,可以是元组也可以是列表。

    #使用arrray()函数创建数组----由元组序列构成的一维数组
    arr1 = np.array((1,20,13,28,22))
    arr1
    
    array([ 1, 20, 13, 28, 22])
    
    #使用arrray()函数创建数组----由列表序列构成的一维数组
    arr2 = np.array([1,1,2,3,5])
    arr2
    
    array([1, 1, 2, 3, 5])
    
    
    
    2.二维数组的创建
    
    #使用元组套元组的方式
    arr3 = np.array(((1,1,2,3),(5,8,13,21),(34,55,89,144)))
    arr3
    
    array([[  1,   1,   2,   3],
           [  5,   8,  13,  21],
           [ 34,  55,  89, 144]])
    
    #使用列表套列表的方式
    arr4 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
    arr4
    
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    

    3 .numpy提供的几种特殊数组

    #返回一维数组全为1的数组
    np.ones(3)
    
    array([ 1.,  1.,  1.])
    
    #返回元素全为1的3X4二维数组
    np.ones([3,4])
    
    array([[ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.]])
    
    #返回元素全为0的3X4二维数组
    np.zeros([3,4])
    
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    
    • 有关数组的属性和函数

    1 .属性(方法)

    #直接数组名称查看
    
    #shape方法返回数组的行数和列数
    arr3.shape   #此处没有(),否则报错
    
    (3, 4)
    
    #dtype方法返回数组的数据类型
    arr3.dtype
    
    dtype('int32')
    
    #通过ravel的方法将数组拉直(多维数组将为一维数组)
    a = arr3.ravel()
    a
    
    array([  1,   1,   2,   3,   5,   8,  13,  21,  34,  55,  89, 144])
    
    #通过flatten方法将数组拉直
    b = arr3.flatten()
    b
    
    array([  1,   1,   2,   3,   5,   8,  13,  21,  34,  55,  89, 144])
    

    两者的区别在于ravel方法生成的是原数组的视图,无需占有内存空间,但视图的改变会影响到原数组的变化。而flatten方法返回的是真实值,其值的改变并不会影响原数组的更改。

    #例子:
    b[:3]=0
    arr3
    
    array([[  1,   1,   2,   3],
           [  5,   8,  13,  21],
           [ 34,  55,  89, 144]])
    
    a[:3]=0
    arr3
    
    array([[  0,   0,   0,   3],
           [  5,   8,  13,  21],
           [ 34,  55,  89, 144]])
    
    arr4.ndim  #返回数组的维数
    
    2
    
    arr4.size   #返回数组元素的个数
    
    12
    
    arr4.T   #返回数组的转置结果
    
    array([[ 1,  5,  9],
           [ 2,  6, 10],
           [ 3,  7, 11],
           [ 4,  8, 12]])
    

    如果数组的数据类型为复数的话,real方法可以返回复数的实部,imag方法返回复数的虚部。

    2.函数

    len(arr4)  #返回数组有多少行
    
    3
    
    np.hstack((arr3,arr4))   #横向拼接arr3和arr4两个数组,但必须满足两个数组的行数相同
    
    array([[  0,   0,   0,   3,   1,   2,   3,   4],
           [  5,   8,  13,  21,   5,   6,   7,   8],
           [ 34,  55,  89, 144,   9,  10,  11,  12]])
    
    np.vstack((arr3,arr4))  #纵向拼接
    
    array([[  0,   0,   0,   3],
           [  5,   8,  13,  21],
           [ 34,  55,  89, 144],
           [  1,   2,   3,   4],
           [  5,   6,   7,   8],
           [  9,  10,  11,  12]])
    
    np.column_stack((arr3,arr4))  #与hstack函数具有一样的效果
    
    array([[  0,   0,   0,   3,   1,   2,   3,   4],
           [  5,   8,  13,  21,   5,   6,   7,   8],
           [ 34,  55,  89, 144,   9,  10,  11,  12]])
    
    np.row_stack((arr3,arr4))   #与vstack函数具有一样的效果
    
    array([[  0,   0,   0,   3],
           [  5,   8,  13,  21],
           [ 34,  55,  89, 144],
           [  1,   2,   3,   4],
           [  5,   6,   7,   8],
           [  9,  10,  11,  12]])
    

    reshape()函数和resize()函数可以重新设置数组的行数和列数:

    arr5 =np.array(np.arange(24))
    arr5  #此为一维数组
    
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
           17, 18, 19, 20, 21, 22, 23])
    
    a = arr5.reshape(4,6) #reshape函数
    a
    
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11],
           [12, 13, 14, 15, 16, 17],
           [18, 19, 20, 21, 22, 23]])
    
    a.resize(6,4)  #resize()函数
    a
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]])
    
    #tolist将数组转换为列表
    b=a.tolist()
    type(b)    #'list' object has no attribute 'dtype' 
    
    list
    
    #astype()强制转换数组的数据类型
    c = a.astype(float)
    print("a数组的数据类型是%s" %a.dtype ,
          "c数组的数据类型是%s" %c.dtype)
    
    a数组的数据类型是int32 c数组的数据类型是float64
    
    • .数组元素的获取

    通过索引和切片的方式获取数组元素

    1 . 一维数组元素的获取

    arr7 = np.array(np.arange(10))
    arr7
    
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    #获取第4个元素
    arr7[3]
    
    3
    
    #获取前3个元素
    arr7[:3]
    
    array([0, 1, 2])
    
    #获取第4个元素之后的所有元素
    arr7[3:]
    
    array([3, 4, 5, 6, 7, 8, 9])
    
    #获取末尾的2个元素
    arr7[-2:]
    
    array([8, 9])
    
    #从第1个元素开始,获取步长为2的所有元素
    arr7[::2]
    
    array([0, 2, 4, 6, 8])
    

    2.二维数组元素的获取

    arr8 = np.array(np.arange(12)).reshape(3,4)
    arr8
    
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    arr8[:2]   #返回数组的前2行
    
    array([[0, 1, 2, 3],
           [4, 5, 6, 7]])
    
    #返回指定的第1行和第3行
    arr8[[0,2]]
    
    array([[ 0,  1,  2,  3],
           [ 8,  9, 10, 11]])
    
    arr8[:,-2:] #返回数组 的后2列
    
    array([[ 2,  3],
           [ 6,  7],
           [10, 11]])
    
    #返回数组的第1列和第3列
    arr8[:,[0,2]]
    
    array([[ 0,  2],
           [ 4,  6],
           [ 8, 10]])
    
    #返回数组中第2行第3列对应的元素
    arr8[1,2]
    
    6
    

    布尔索引,即索引值为True和False,需要注意的是布尔索引必须输数组对象。

    log = np.array([True,False,True])   #返回所有为True的对应行
    arr8[log]
    
    
    array([[ 0,  1,  2,  3],
           [ 8,  9, 10, 11]])
    
    arr8[-log]      #通过符号筛选出所有为False的对应行
    
    E:\anaconda\lib\site-packages\ipykernel\__main__.py:1: DeprecationWarning: numpy boolean negative, the `-` operator, is deprecated, use the `~` operator or the logical_not function instead.
      if __name__ == '__main__':
    
    
    
    
    
    array([[4, 5, 6, 7]])
    
    #举个例子:
    area = np.array(['A','B','A','C','A','B','D'])
    area
    observes = np.array(np.arange(21)).reshape(7,3)
    observes
    observes[area == 'A']   #返回所有为'A'的观测
    
    
    array([[ 0,  1,  2],
           [ 6,  7,  8],
           [12, 13, 14]])
    
    #条件值需要在&(and),|(or)两端用圆括号括起来
    observes[(area == 'A') | (area == 'D')]
    
    array([[ 0,  1,  2],
           [ 6,  7,  8],
           [12, 13, 14],
           [18, 19, 20]])
    
    #布尔索引也可以与普通索引或切片混合使用:
    observes[area == 'A'][:,[0,2]]    #返回A区域的所有行,且只获取第1列与第3列数据。
    
    array([[ 0,  2],
           [ 6,  8],
           [12, 14]])
    

    花式索引:将数组作为索引将原数组的元素提取出来

    arr8[[2,1]]   #按照指定顺序返回指定行
    
    array([[ 8,  9, 10, 11],
           [ 4,  5,  6,  7]])
    
    arr8[[2,1]][:,[0,2]]  #返回指定的行与列
    
    array([[ 8, 10],
           [ 4,  6]])
    
    #使用比较简单的方式返回指定行以列的二维数组的话,可以使用ix_()函数
    arr8[np.ix_([2,1],[0,2])]
    
    array([[ 8, 10],
           [ 4,  6]])
    

    相关文章

      网友评论

        本文标题:Numpy学习-1

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