1. 程式人生 > 其它 >【翻譯】高效numpy指北

【翻譯】高效numpy指北

ref:link

why numpy

  • 運算高效

numpy 記憶體結構

  • 一塊記憶體區域
  • dtype 確定了記憶體區域資料型別
  • metadata 比如 shapestrides etc

注:numpy 記憶體佔用和 C 基本相同,多了常數記憶體消耗

numpy 廣播機制

自動將常數變為可以參與運算的形式

  • 無需對常數變成可以進行運算的大小(自動)

注意:

  • 廣播機制是邏輯上的參與運算,並沒有建立相應的矩陣(向量)

indexing

陣列切片

[::k] k 是步長

import numpy as np
x = np.arange(6).reshape(2,3)
'''
x=[[0,1,2],
   [3,4,5]]
'''
x[:,::2]
'''
[[0, 2],
 [3, 5]]
'''
x[::2,::2]
'''
array([[0, 2]])
'''
x[:,::-1]
'''
array([[2, 1, 0],
       [5, 4, 3]])
'''
x[::-1,::-1]
'''
array([[5, 4, 3],
       [2, 1, 0]])
'''

簡單的index 返回的是原陣列的一個view,而非copy

x[::-1,::-1]
'''
array([[5, 4, 3],
       [2, 1, 0]])
'''
>>> x[::-1,::-1][1][1]=120
>>> x
array([[  0, 120,   2],
       [  3,   4,   5]])

>>> c =x[::-1,::-1]
>>> c[0][0]=123
>>> x
array([[  0,   1,   2],
       [  3,   4, 123]])

fancy indexing

fancy index 返回值 通常是一個 copy。

  • mask

    >>> x = np.arange(6).reshape(2,3)
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    
    >>> mask = x%2==0
    >>> mask
    array([[ True, False,  True],
           [False,  True, False]], dtype=bool
    >>> x[mask]
    array([0, 2, 4])
    ## 測試返回的是copy 而不是 view
    >>> x[mask][0]=122
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    
  • 通過index選擇

    >>> x = np.arange(6)
    >>> x
    array([[0, 1, 2, 3, 4, 5]])
    >>> indices =[1,2,-1,1]
    >>> x[indices]
    array([1, 2, 5, 1])