Numpy學習 Day1

枸杞燙水發表於2020-10-19

Numpy學習 Day1

[toc]

常量

  • numpy.nan

    • 表示空值,nan = NaN = NAN

    • 兩個numpy.nan是不相等的

    • numpy.isnan(x, *args, **kwargs)逐個元素的測試nan,並將結果以布林陣列返回。

  • numpy.inf

    • 表示正無窮大, Inf = inf = infty = Infinity = PINF
  • numpy.pi

    • 表示圓周率 pi = 3.1415926535897932384626433…
  • numpy.e

    • 表示自然常數 e = 2.71828182845904523536028747135266249775724709369995…

資料型別

  • 常見資料型別

    型別備註說明
    bool_ = bool88位布林型別
    int8 = byte8位整型
    int16 = short16位整型
    int32 = intc32位整型
    int_ = int64 = long = int0 = intp64位整型
    uint8 = ubyte8位無符號整型
    uint16 = ushort16位無符號整型
    uint32 = uintc32位無符號整型
    uint64 = uintp = uint0 = uint64位無符號整型
    float16 = half16位浮點型
    float32 = single32位浮點型
    float_ = float64 = double64位浮點型
    str_ = unicode_ = str0 = unicodeUnicode 字串
    datetime64日期時間型別
    timedelta64表示兩個時間之間的間隔
  • 建立資料型別

    • numpy 的數值型別實際上是 dtype 物件的例項。

    • 每個內建型別都有一個唯一定義它的字元程式碼

      字元對應型別備註
      bboolean‘b1’
      isigned integer‘i1’, ‘i2’, ‘i4’, ‘i8’
      uunsigned integer‘u1’, ‘u2’ ,‘u4’ ,‘u8’
      ffloating-point‘f2’, ‘f4’, ‘f8’
      ccomplex floating-point
      mtimedelta64表示兩個時間之間的間隔
      Mdatetime64日期時間型別
      Oobject
      S(byte-)stringS3表示長度為3的字串
      UUnicodeUnicode 字串
      Vvoid
  • 資料型別資訊

    • NumPy和Python整數型別的行為在整數溢位方面存在顯著差異,與 NumPy 不同,Python 的int 是靈活的。這意味著Python整數可以擴充套件以容納任何整數並且不會溢位。

    • numpy.iinfo()可以例項化檢視int資料型別的最大值(.max)、最小值(.min)

      import numpy as np
      
      ii16 = np.iinfo(np.int16)
      print(ii16.min)  # -32768
      print(ii16.max)  # 32767
      
    • numpy.finfo()可以例項化檢視float資料型別的

      最大值(.max)、

      最小值(.min)、

      eps是取非負的最小值

      bits位數

      import numpy as np
      
      ff16 = np.finfo(np.float16)
      print(ff16.bits)  # 16
      print(ff16.min)  # -65500.0
      print(ff16.max)  # 65500.0
      print(ff16.eps)  # 0.000977
      

時間日期和時間增量

  • datetime64 基礎

    • 在 numpy 中,我們很方便的將字串轉換成時間日期型別 datetime64datetime 已被 python 包含的日期時間庫所佔用)。

      datatime64是帶單位的日期時間型別,其單位如下:

      日期單位程式碼含義時間單位程式碼含義
      Yh小時
      Mm分鐘
      Ws
      Dms毫秒
      --us微秒
      --ns納秒
      --ps皮秒
      --fs飛秒
      --as阿託秒
    • 從字串建立 datetime64 型別時,預設情況下,numpy 會根據字串自動選擇對應的單位。

    • 從字串建立 datetime64 型別時,可以強制指定使用的單位。

    • 如果兩個 datetime64 物件具有不同的單位,它們可能仍然代表相同的時刻。並且從較大的單位(如月份)轉換為較小的單位(如天數)是安全的。

    • 從字串建立 datetime64 陣列時,如果單位不統一,則一律轉化成其中最小的單位。

    • 使用arange()建立 datetime64 陣列,用於生成日期範圍。

  • datetime64 和 timedelta64 運算

    • timedelta64 表示兩個 datetime64 之間的差。timedelta64 也是帶單位的,並且和相減運算中的兩個 datetime64 中的較小的單位保持一致。

    • 生成 timedelta64時,要注意年(‘Y’)和月(‘M’)這兩個單位無法和其它單位進行運算(一年有幾天?一個月有幾個小時?這些都是不確定的)。

    • numpy.datetime64 與 datetime.datetime 相互轉換

      import numpy as np
      import datetime
      
      dt = datetime.datetime(year=2020, month=6, day=1, hour=20, minute=5, second=30)
      dt64 = np.datetime64(dt, 's')
      print(dt64, dt64.dtype)
      # 2020-06-01T20:05:30 datetime64[s]
      
      dt2 = dt64.astype(datetime.datetime)
      print(dt2, type(dt2))
      # 2020-06-01 20:05:30 <class 'datetime.datetime'>
      
  • datetime64 的應用

    • 為了允許在只有一週中某些日子有效的上下文中使用日期時間,NumPy包含一組“busday”(工作日)功能。

      numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)
      
    • 將指定的偏移量應用於工作日,單位天(‘D’)。計算下一個工作日,如果當前日期為非工作日,預設報錯。可以指定 forwardbackward 規則來避免報錯。(一個是向前取第一個有效的工作日,一個是向後取第一個有效的工作日)

      import numpy as np
      
      # 2020-07-10 星期五
      a = np.busday_offset('2020-07-10', offsets=1)
      print(a)  # 2020-07-13
      
      a = np.busday_offset('2020-07-11', offsets=1)
      print(a)
      # ValueError: Non-business day date in busday_offset
      
    • 可以指定偏移量為 0 來獲取當前日期向前或向後最近的工作日,當然,如果當前日期本身就是工作日,則直接返回當前日期。

      a = np.busday_offset('2020-07-11', offsets=0, roll='forward')
      b = np.busday_offset('2020-07-11', offsets=0, roll='backward')
      print(a)  # 2020-07-13
      print(b)  # 2020-07-10
      
      a = np.busday_offset('2020-07-11', offsets=1, roll='forward')
      b = np.busday_offset('2020-07-11', offsets=1, roll='backward')
      print(a)  # 2020-07-14
      print(b)  # 2020-07-13
      
    • 返回指定日期是否是工作日。is_busday()

      import numpy as np
      
      # 2020-07-10 星期五
      a = np.is_busday('2020-07-10')
      b = np.is_busday('2020-07-11')
      print(a)  # True
      print(b)  # False
      
    • 統計一個 datetime64[D] 陣列中的工作日天數。

      np.arange(begindates, enddates, dtype='datetime64')

      np.count_nonzero(np.is_busday(a))

      import numpy as np
      
      # 2020-07-10 星期五
      begindates = np.datetime64('2020-07-10')
      enddates = np.datetime64('2020-07-20')
      a = np.arange(begindates, enddates, dtype='datetime64')
      b = np.count_nonzero(np.is_busday(a))
      print(a)
      # ['2020-07-10' '2020-07-11' '2020-07-12' '2020-07-13' '2020-07-14'
      #  '2020-07-15' '2020-07-16' '2020-07-17' '2020-07-18' '2020-07-19']
      print(b)  # 6
      
    • 自定義周掩碼值,即指定一週中哪些星期是工作日。

      np.is_busday(weekmask=[1, 1, 1, 1, 1, 0, 0])

      # 2020-07-10 星期五
      a = np.is_busday('2020-07-10', weekmask=[1, 1, 1, 1, 1, 0, 0])
      b = np.is_busday('2020-07-10', weekmask=[1, 1, 1, 1, 0, 0, 1])
      print(a)  # True
      

    print(b) # False

    
    - 返回兩個日期之間的工作日數量。
    
    ```numpy.busday_count(begindates, enddates, weekmask='1111100', holidays=[], busdaycal=None, out=None)```
    
    ```python
    import numpy as np
    
    # 2020-07-10 星期五
    begindates = np.datetime64('2020-07-10')
    enddates = np.datetime64('2020-07-20')
    a = np.busday_count(begindates, enddates)
    b = np.busday_count(enddates, begindates)
    print(a)  # 6
    print(b)  # -6
    

陣列的建立

import numpy as np

numpy 提供的最重要的資料結構是ndarray,它是 python 中list的擴充套件。

  • 依據現有資料來建立 ndarray

    • 通過array()函式進行建立

      def array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0): 
      
    • 通過asarray()函式進行建立
          - array()asarray()都可以將結構資料轉化為 ndarray,但是array()asarray()主要區別就是當資料來源是ndarray 時,array()仍然會 copy 出一個副本,佔用新的記憶體,但不改變 dtype 時 asarray()不會。
        - 更改為較大的dtype時,其大小必須是array的最後一個axis的總大小(以位元組為單位)的除數

    • 通過fromfunction()函式進行建立

    給函式繪圖的時候可能會用到fromfunction(),該函式可從函式中建立陣列。

    def fromfunction(function, shape, **kwargs):
    
  • 依據 ones 和 zeros 填充方式

    在機器學習任務中經常做的一件事就是初始化引數,需要用常數值或者隨機值來建立一個固定大小的矩陣。

    • 零陣列

      • zeros()函式:返回給定形狀和型別的零陣列。輸入的是shape

      • zeros_like()函式:返回與給定陣列形狀和型別相同的零陣列。輸入的是array

        def zeros(shape, dtype=None, order='C'):
        def zeros_like(a, dtype=None, order='K', subok=True, shape=None):
        
    • 1陣列

      • ones()函式:返回給定形狀和型別的1陣列。

      • ones_like()函式:返回與給定陣列形狀和型別相同的1陣列。

        def ones(shape, dtype=None, order='C'):
        def ones_like(a, dtype=None, order='K', subok=True, shape=None):
        
    • 空陣列

      • empty()函式:返回一個空陣列,陣列元素為隨機數。

      • empty_like函式:返回與給定陣列具有相同形狀和型別的新陣列

        def empty(shape, dtype=None, order='C'): 
        def empty_like(prototype, dtype=None, order='K', subok=True, shape=None):
        
    • 單位陣列

      • eye()函式:返回一個對角線上為1,其它地方為零的單位陣列。

      • identity()函式:返回一個方的單位陣列。

        def eye(N, M=None, k=0, dtype=float, order='C'):
        def identity(n, dtype=None):
        
    • 對角陣列

      • diag()函式:提取對角線或構造對角陣列。

        def diag(v, k=0):
        
        import numpy as np
        
        x = np.arange(9).reshape((3, 3))
        print(x)
        # [[0 1 2]
        #  [3 4 5]
        #  [6 7 8]]
        print(np.diag(x))  # [0 4 8]
        print(np.diag(x, k=1))  # [1 5]
        print(np.diag(x, k=-1))  # [3 7]
        
        v = [1, 3, 5, 7]
        x = np.diag(v)
        print(x)
        # [[1 0 0 0]
        #  [0 3 0 0]
        #  [0 0 5 0]
        #  [0 0 0 7]]
        
    • 常數陣列

      • full()函式:返回一個常數陣列。

      • full_like()函式:返回與給定陣列具有相同形狀和型別的常數陣列。

        def full(shape, fill_value, dtype=None, order='C'):
        def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):
        
  • 利用數值範圍來建立ndarray

    • arange()函式:返回給定間隔內的均勻間隔的值。

    • linspace()函式:返回指定間隔內的等間隔數字。

    • logspace()函式:返回數以對數刻度均勻分佈。

    • numpy.random.rand() 返回一個由[0,1)內的隨機陣列成的陣列。

      def arange([start,] stop[, step,], dtype=None): 
      def linspace(start, stop, num=50, endpoint=True, retstep=False, 
                   dtype=None, axis=0):
      def logspace(start, stop, num=50, endpoint=True, base=10.0, 
                   dtype=None, axis=0):
      def rand(d0, d1, ..., dn): 
      
  • 結構陣列的建立

    結構陣列,首先需要定義結構,然後利用np.array()來建立陣列,其引數dtype為定義的結構。

    • 利用字典來定義結構

      import numpy as np
      
      personType = np.dtype({
          'names': ['name', 'age', 'weight'],
          'formats': ['U30', 'i8', 'f8']})
      
      a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
                   dtype=personType)
      print(a, type(a))
      # [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
      # <class 'numpy.ndarray'>
      
    • 利用包含多個元組的列表來定義結構

      import numpy as np
      
      personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])
      a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
                   dtype=personType)
      print(a, type(a))
      # [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
      # <class 'numpy.ndarray'>
      
      # 結構陣列的取值方式和一般陣列差不多,可以通過下標取得元素:
      print(a[0])
      # ('Liming', 24, 63.9)
      
      print(a[-2:])
      # [('Mike', 15, 67. ) ('Jan', 34, 45.8)]
      
      # 我們可以使用欄位名作為下標獲取對應的值
      print(a['name'])
      # ['Liming' 'Mike' 'Jan']
      print(a['age'])
      # [24 15 34]
      print(a['weight'])
      # [63.9 67.  45.8]
      
    • 陣列的屬性

      在使用 numpy 時,你會想知道陣列的某些資訊。很幸運,在這個包裡邊包含了很多便捷的方法,可以給你想要的資訊。

      • numpy.ndarray.ndim用於返回陣列的維數(軸的個數)也稱為秩,一維陣列的秩為 1,二維陣列的秩為 2,以此類推。
      • numpy.ndarray.shape表示陣列的維度,返回一個元組,這個元組的長度就是維度的數目,即 ndim 屬性(秩)。
      • numpy.ndarray.size陣列中所有元素的總量,相當於陣列的shape中所有元素的乘積,例如矩陣的元素總量為行與列的乘積。
      • numpy.ndarray.dtype ndarray 物件的元素型別。
      • numpy.ndarray.itemsize以位元組的形式返回陣列中每一個元素的大小。
      • ndarray中所有元素必須是同一型別,否則會自動向下轉換,int->float->str

相關文章