2018年2月7日 星期三

[NumPy] NumPy Basic

NumPy是大部分Python熱門程式庫的底層, 有龐大的生態體系, 是學習其它套件的入門磚, 學習NumPy的關鍵在於它的矩陣處理, 不同套件之間透過轉換處理之後即可輕鬆整合, 這裡記錄常用語法方便查詢用 



import numpy as np

a = np.array([1,2,3])
a + a
#array([2, 4, 6])

def print_array_detail(a):
    print 'Dimensions: %d, shape: %s, dtype: %s'\
              %(a.ndim, a.shape, a.dtype)
print_array_detail(a)
#Dimensions: 1, shape:(3, ), dtype:int64

a = a.reshape([3, 1])
a
#array([[1],
#       [2],
#       [3]])

#reshape中的-1,會自動幫我們計算該維度的大小應該是多少
#舉一個1*2*3的矩陣a,reshape成b, c, d矩陣,給大家參考
a = np.arange(6).reshape(1, 2, 3) # 6個值放在1*2*3的陣列中
#總共只有6個值,我要把它放在2維陣列,且第二維長度要為6,-1會幫我們算出第1維應該要是多少。("1",6)
b = a.reshape(-1, 6)
#總共只有6個值,我要把它放在2維陣列,且第一維長度要為3,
#-1放在第2維會幫我們算出第2維應該要是多少。(3,"2")
c = a.reshape(3, -1)
d = a.reshape(1, 1, -1) #6個值放在(1, 1, ?)的陣列中,?會是"6"
print(f"a的shape: {a.shape}") #a的shape: (1, 2, 3)
print(f"b的shape: {b.shape}") #b的shape: (1, 6)
print(f"c的shape: {c.shape}") #c的shape: (3, 2)
print(f"d的shape: {d.shape}") #d的shape: (1, 1, 6)

a = np.array([[1,2,3,4],[5,6,7,8]], np.int32)
a.shape #(2,4)
a.shape = (8,)##攤平
a
#array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32)

a = a.reshape([2,2,2])##變成3維
#array([[1,2],
#       [3,4]],
#      [[5,6],
#       [7,8]]], dtype=int32)

print_array_detail(a) 
#Dimensions: 3, shape:(2,2,2), dtype:int64

建立陣列

np.zeros([2,3])
#array([[0., 0., 0.],
#      [0., 0., 0.]])

np.ones([2,3])
#array([[1., 1., 1.],
#       [1., 1., 1.]])

np.empty((2,3))##存放記憶體位置
#array([[4.94e-323, 9.88e-323, 1.48e-322],
       #[1.98e-322, 2.47e-322, 2.96e-322]])

np.random.random((2,3))
#array([[0.70320172, 0.80210734, 0.21202405],
#       [0.60888451, 0.40580769, 0.77243115]])

np.linspace(2,10,5)##2~10中間切5份
#array([ 2.,  4.,  6.,  8., 10.])

np.arange(2,10,2)
#array([2, 4, 6, 8])

np.full((2,2), 5)
#array([[5, 5],
#       [5, 5]])

np.eye(3)
#array([[1, 0, 0],
#       [0, 1, 0]
#       [0, 0, 1]])

#建立矩陣
np.array([1, 2, 3], [2, 4, 5])
#array([[1, 2, 3],
#       [2, 4, 5]])

基本操作

a = np.array([1,2,3,4,5,6])
a[3], a[3:5], a[:4:2], a[::-1]##反轉
#(4, array([4, 5]), array([1, 3]), array([6, 5, 4, 3, 2, 1]))

a = np.array([10,20,30,40,50,60])
a > 50
#array([False, False, False, False, False,  True])

a = np.arange(8).reshape((2,4))
a
#array([[0, 1, 2, 3],
#       [4, 5, 6, 7]])

a.min(axis=1), a.sum(axis=0), a.mean(axis=1), a.std(axis=1)##敘述統計
#(array([0, 4]),
# array([ 4,  6,  8, 10]),
# array([1.5, 5.5]),
#array([1.11803399, 1.11803399]))

np.cumsum(a, axis=1)##
#array([[ 0,  1,  3,  6],
#       [ 4,  9, 15, 22]])

pi = np.pi
a = np.array([pi, pi/2, pi/4, pi/6])
a
#array([3.14159265, 1.57079633, 0.78539816, 0.52359878])

np.degrees(a)
#array([180., 90., 45., 30.])

# 布林遮罩
mask= (a%3 == 0)
b = a[mask]
#array([3, 6])

函式

##functin 
def function(a):
    return a
a = np.arange(10)
function(a)
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

切割

x = np.arrange(6).reshape(2,3)

# [[0,1,2],
#  [3,4,5]]

x[0,0:2] 
#[0,1]

x[:,1:] 
# [[1,2],
#  [4,5]]

x[::1,::2]
# [[0,2],
#  [3,5]]


陣列廣播

當兩個陣列形狀不同, numpy陣列廣播可以讓較小的陣列擴張成大型陣列

Stack



Ref:

  • Kryan Dale著,林紀岩譯 , 資料視覺化使用Python與JavaScript , O'REILLY
  • 陳允傑著, Python資料科學與人工智慧應用實務 , 旗標
  • 台灣人工智慧學校

沒有留言:

張貼留言