zoukankan      html  css  js  c++  java
  • numpy——基础数组与计算

    In [1]:
    import  numpy as np
    
    In [11]:
    # 创建数组
    a = np.array([1,2,3,4,5])
    
    In [12]:
    a
    
    Out[12]:
    array([1, 2, 3, 4, 5])
    In [9]:
    np.array(range(1,6))
    
    Out[9]:
    array([1, 2, 3, 4, 5])
    In [10]:
    np.arange(1,6)
    
    Out[10]:
    array([1, 2, 3, 4, 5])
    In [13]:
    # 数组的类名
    type(a)
    
    Out[13]:
    numpy.ndarray
    In [14]:
    # 数据的类型
    a.dtype
    
    Out[14]:
    dtype('int32')
    In [15]:
    t1 = np.arange(12)
    
    In [16]:
    t1
    
    Out[16]:
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    In [17]:
    t1.shape
    
    Out[17]:
    (12,)
    In [18]:
    t2 = np.array([[1,2,3], [2,3,4]])
    
    In [19]:
    t2
    
    Out[19]:
    array([[1, 2, 3],
           [2, 3, 4]])
    In [20]:
    # 数据的形状
    t2.shape
    
    Out[20]:
    (2, 3)
    In [21]:
    t3 = np.array([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])
    
    In [22]:
    t3.shape
    
    Out[22]:
    (2, 2, 3)
    In [23]:
    t3
    
    Out[23]:
    array([[[ 1,  2,  3],
            [ 4,  5,  6]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    In [24]:
    t4 = np.arange(12)
    
    In [25]:
    # 3行4列
    t4.reshape((3, 4))
    
    Out[25]:
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    In [26]:
    t4.reshape((3, 5))
    
     
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-26-a0fbe961a05c> in <module>
    ----> 1t4.reshape((3, 5))
    
    ValueError: cannot reshape array of size 12 into shape (3,5)
    In [8]:
    t5 = np.arange(24)
    
    In [9]:
    # 2块2行6列
    t5.reshape(2, 2, 6)
    
    Out[9]:
    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]]])
    In [10]:
    # 2块3行4列
    t5.reshape(2, 3, 4)
    
    Out[10]:
    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]]])
    In [11]:
    t5
    
    Out[11]:
    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])
     

    可以看出,reshape方法,没有改变t5的原始值,说明方法本身就存在return方法

    In [31]:
    # 需要改变的话
    t5 = t5.reshape((4, 6))
    
     

    如果t5为None的话,就说明某方法会直接改变原始值,不存在return方法

    In [32]:
    t5
    
    Out[32]:
    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]])
     

    数据类型的操作

    指定创建的数组的数据类型

    In [2]:
    a = np.array([1,0,1,0],dtype=np.bool) # 或者使用dtype='?'

    
    
    In [3]:
    a
    
    Out[3]:
    array([ True, False,  True, False])
    In [4]:
    # 修改数组的数据类型
    a.astype('i1') # 或者使用a.astype(np.int8)
    
    Out[4]:
    array([1, 0, 1, 0], dtype=int8)
    In [5]:
    # 修改浮点型的小数位数
    b = np.array([0.03214, 0.4243564, 0.42566453, 0.4134234, 0.1235, 0.85763])
    
    In [6]:
    np.round(b, 2)
    
    Out[6]:
    array([0.03, 0.42, 0.43, 0.41, 0.12, 0.86])
    In [12]:
    t5
    
    Out[12]:
    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])
    In [13]:
    t5 = t5.reshape((4, 6))
    
    In [14]:
    t5
    
    Out[14]:
    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]])
    In [15]:
    # 将数组转换成一维数组
    t5.flatten()
    
    Out[15]:
    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])
     

    数组和数的计算

    In [22]:
    a = np.arange(24).reshape(2,2,6)
    
    In [23]:
    a
    
    Out[23]:
    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]]])
    In [24]:
    # 加法
    a + 1
    
    Out[24]:
    array([[[ 1,  2,  3,  4,  5,  6],
            [ 7,  8,  9, 10, 11, 12]],
    
           [[13, 14, 15, 16, 17, 18],
            [19, 20, 21, 22, 23, 24]]])
    In [25]:
    # 乘法
    a * 3
    
    Out[25]:
    array([[[ 0,  3,  6,  9, 12, 15],
            [18, 21, 24, 27, 30, 33]],
    
           [[36, 39, 42, 45, 48, 51],
            [54, 57, 60, 63, 66, 69]]])
     

    数组与数组的计算

    In [26]:
    a = np.arange(12).reshape(2, 6)
    
    In [28]:
    b = np.arange(21, 33).reshape(2, 6)
    
    In [29]:
    a
    
    Out[29]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    In [30]:
    b
    
    Out[30]:
    array([[21, 22, 23, 24, 25, 26],
           [27, 28, 29, 30, 31, 32]])
     

    数组和数组加减法

    In [31]:
    a + b
    
    Out[31]:
    array([[21, 23, 25, 27, 29, 31],
           [33, 35, 37, 39, 41, 43]])
    In [32]:
    a - b
    
    Out[32]:
    array([[-21, -21, -21, -21, -21, -21],
           [-21, -21, -21, -21, -21, -21]])
     

    数组和数组的乘除法

    In [33]:
    a * b
    
    Out[33]:
    array([[  0,  22,  46,  72, 100, 130],
           [162, 196, 232, 270, 310, 352]])
    In [34]:
    a / b
    
    Out[34]:
    array([[0.        , 0.04545455, 0.08695652, 0.125     , 0.16      ,
            0.19230769],
           [0.22222222, 0.25      , 0.27586207, 0.3       , 0.32258065,
            0.34375   ]])
    In [35]:
    np.round(a / b, 2)
    
    Out[35]:
    array([[0.  , 0.05, 0.09, 0.12, 0.16, 0.19],
           [0.22, 0.25, 0.28, 0.3 , 0.32, 0.34]])
     

    不同维度的数组计算

    In [36]:
    # 2行6列
    a
    
    Out[36]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    In [37]:
    b = np.array([[1,2,3], [2,3,4]])
    
    In [38]:
    # 2行3列
    b
    
    Out[38]:
    array([[1, 2, 3],
           [2, 3, 4]])
     

    维度完全没有关系

    In [39]:
    a + b
    
     
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-39-bd58363a63fc> in <module>
    ----> 1a + b
    
    ValueError: operands could not be broadcast together with shapes (2,6) (2,3) 
    In [40]:
    a * c
    
     
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-40-3f6f667472ca> in <module>
    ----> 1a * c
    
    NameError: name 'c' is not defined
    In [41]:
    # 2行6列
    a
    
    Out[41]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    In [42]:
    # 1行6列
    b = np.array([2,3,4,5,6,7])
    
    In [43]:
    a.shape
    
    Out[43]:
    (2, 6)
    In [44]:
    b.shape
    
    Out[44]:
    (6,)
     

    如果有(从右向左)维度相同的话,操作是可以执行的,按照对应维度广播操作

    In [45]:
    # 2行6列
    a
    
    Out[45]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    In [48]:
    # 1行6列
    b
    
    Out[48]:
    array([2, 3, 4, 5, 6, 7])
    In [49]:
    # 一整行一整行的计算
    a + b
    
    Out[49]:
    array([[ 2,  4,  6,  8, 10, 12],
           [ 8, 10, 12, 14, 16, 18]])
    In [50]:
    # 一整行一整行的计算
    a * b
    
    Out[50]:
    array([[ 0,  3,  8, 15, 24, 35],
           [12, 21, 32, 45, 60, 77]])
    In [52]:
    c = np.array([[1],[2]])
    
    In [53]:
    c
    
    Out[53]:
    array([[1],
           [2]])
    In [55]:
    c.shape
    
    Out[55]:
    (2, 1)
    In [57]:
    a.shape
    
    Out[57]:
    (2, 6)
    In [59]:
    # 2行6列
    a
    
    Out[59]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    In [60]:
    # 2行1列
    c
    
    Out[60]:
    array([[1],
           [2]])
    In [61]:
    # 一列一列的计算
    a + c
    
    Out[61]:
    array([[ 1,  2,  3,  4,  5,  6],
           [ 8,  9, 10, 11, 12, 13]])
    In [62]:
    # 一列一列的计算
    a / c
    
    Out[62]:
    array([[0. , 1. , 2. , 3. , 4. , 5. ],
           [3. , 3.5, 4. , 4.5, 5. , 5.5]])
     

    广播原则

    如果两个数组的后缘维度(trailing dimension,既从末尾开始算起的维度)

    的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。

    广播会在缺失和(或)长度为1的维度上进行。

    In [75]:
    a = np.arange(27).reshape(3,3,3)
    
    In [76]:
    b = np.arange(18).reshape(3,3,2)
    
    In [77]:
    c = np.arange(6).reshape(3,2)
    
    In [78]:
    a.shape
    
    Out[78]:
    (3, 3, 3)
    In [79]:
    b.shape
    
    Out[79]:
    (3, 3, 2)
    In [80]:
    c.shape
    
    Out[80]:
    (3, 2)
    In [81]:
    a + c
    
     
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-81-e81e582b6fa9> in <module>
    ----> 1a + c
    
    ValueError: operands could not be broadcast together with shapes (3,3,3) (3,2) 
    In [82]:
    b + c
    
    Out[82]:
    array([[[ 0,  2],
            [ 4,  6],
            [ 8, 10]],
    
           [[ 6,  8],
            [10, 12],
            [14, 16]],
    
           [[12, 14],
            [16, 18],
            [20, 22]]])
    In [ ]:
     
  • 相关阅读:
    LeetCode 264. Ugly Number II
    LeetCode 231. Power of Two
    LeetCode 263. Ugly Number
    LeetCode 136. Single Number
    LeetCode 69. Sqrt(x)
    LeetCode 66. Plus One
    LeetCode 70. Climbing Stairs
    LeetCode 628. Maximum Product of Three Numbers
    Leetcode 13. Roman to Integer
    大二暑假周进度报告03
  • 原文地址:https://www.cnblogs.com/pywjh/p/10806337.html
Copyright © 2011-2022 走看看