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 [ ]:
     
  • 相关阅读:
    一个WPF程序UnitTest发生错误的解决办法
    静态代码分析工具
    编程的苦恼
    error: access denied for user to path
    SortableObservableCollection<T>
    OBIEE Reporting Guidelines
    WPF 刷新画面
    编程为什么有趣?
    MultiMediaTimer
    php 序列化 与 反序列化
  • 原文地址:https://www.cnblogs.com/pywjh/p/10806337.html
Copyright © 2011-2022 走看看