1. 程式人生 > >python以及常用庫零碎學習筆記

python以及常用庫零碎學習筆記

python

賦值操作和淺拷貝

佔位符,後面補充。

numpy

訪問陣列:索引和切片

如果訪問的時候使用了整數索引,那麼產生的結果的維度數會降低,如果全部使用切片,則維度數不變。

# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

col_r1 = a[:, 1] #有一個維度是索引
col_r2 = a[:, 1:2] #都是切片
print(col_r1, col_r1.shape)  # Prints "[ 2  6 10] (3,)"
print(col_r2, col_r2.shape)  # Prints "[[ 2]
                                            #          [ 6]
                                            #          [10]] (3, 1)"

另外,下面兩種訪問方式等價:

print(a[[0, 1, 2], [0, 1, 0]])  # Prints "[1 4 5]"
print(np.array([a[0, 0], a[1, 1], a[2, 0]]))  # Prints "[1 4 5]"

布林陣列訪問

a = np.array([[1,2], [3, 4], [5, 6]])
bool_idx = (a > 2)  
print(bool_idx)      # Prints "[[False False]
                            #          [ True  True]
                            #          [ True  True]]"

print(a[bool_idx]) # Prints "[3 4 5 6]",等價於print(a[a>2])

按某個維度求和

先解釋一下numpy的維度。維度為(4,),表示一維向量。維度為(4,1),表示第一個維度有4個元素,每個元素包含一個維度為1非元素。維度為(1,4),表示第一個維度包含1個元素,這個元素是一個維度為(4,)的向量。

舉例說明:

# array([[1, 2, 3],
#        [4, 5, 6]])
x = np.array([[1,2,3],[4,5,6]])

x的維度是(2,3)。numpy矩陣是一種分層套的結構,第一層包含兩個元素:[1,2,3]和[4,5,6],而這兩個元素又各自包含3個元素1,2,3和4,5,6,所以它的維度是(2,3)。注意,(2,3)和(2,3,1)是不一樣的,後者說明套了3層,寫法應該是:

y = np.array([[[1], [2], [3]], [[4], [5], [6]]])

上面y的第一層包含2個元素:[[1], [2], [3]]和[[4], [5], [6]];這2個元素又各自包含了3個元素:[[1], [2], [3]]包含了[1], [2], [3],[[4], [5], [6]]包含了[4], [5], [6];它們又各自包含了1個元素,如[1]包含1,[2]包含2等。

np.sum(x)  # 計算所有元素的和,21

np.sum(x, axis=0) 
# 第一個維度內的元素求和。第一層包含2個元素:[1,2,3]和[4,5,6],二則相加,得到[5,7,9],shape為(3,)

np.sum(x, axis=1) 
# 第二個維度內的元素求和。首先[1,2,3]內所有元素相加,得到6,然後[4,5,6]內所有元素相加,得到15,所以結果為[6,15],shape為(2,)

np.sum(y, axis = 0)
# 第一個維度內的元素求和,即[[1], [2], [3]]+[[4], [5], [6]],等於[[5], [7], [9]],shape為(3,1)

對一位陣列做轉置,相當於啥也沒幹

v = np.array([1,2,3])
print(v)    # Prints "[1 2 3]"
print(v.T)  # Prints "[1 2 3]"

廣播broadcast

廣播的原理
原理是在較低的維度上做一個repeat,然後再做element-wise的加減乘除。例如x.shape=(4,3),y.shape=(3,),那麼就在第一個維度上把y重複4次,得到一個shape=(4,3)的矩陣之後,再和x做element-wise運算。借用某個教程上的例子,解釋如下:

import numpy as np

# We will add the vector v to each row of the matrix x,
# storing the result in the matrix y
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
vv = np.tile(v, (4, 1))  # Stack 4 copies of v on top of each other
print vv                 # Prints "[[1 0 1]
                         #          [1 0 1]
                         #          [1 0 1]
                         #          [1 0 1]]"
y = x + vv  # Add x and vv elementwise
print y  # Prints "[[ 2  2  4
         #          [ 5  5  7]
         #          [ 8  8 10]
         #          [11 11 13]]"

廣播的原則
不是任意兩個矩陣或者向量都能進行廣播的,需要滿足一定的規則。兩個矩陣或向量的維度,從最後一個維度開始比較,需要滿足下面兩點之一:

  • 1、某個維度上數字相等
  • 2、其中一個維度等於1

下面的矩陣都是滿足要求的:


A      (2d array):  5 x 4
B      (1d array):      1
Result (2d array):  5 x 4

A      (2d array):  5 x 4
B      (1d array):      4
Result (2d array):  5 x 4

A      (3d array):  15 x 3 x 5
B      (3d array):  15 x 1 x 5
Result (3d array):  15 x 3 x 5

A      (3d array):  15 x 3 x 5
B      (2d array):       3 x 5
Result (3d array):  15 x 3 x 5

A      (3d array):  15 x 3 x 5
B      (2d array):       3 x 1
Result (3d array):  15 x 3 x 5

下面的則不滿足要求:

A      (1d array):  3
B      (1d array):  4 # trailing dimensions do not match

A      (2d array):      2 x 1
B      (3d array):  8 x 4 x 3 # second from last dimensions mismatched

SciPy

SciPy給予numpy,在此基礎上封裝了很多函式和模組。

影象處理

from scipy.misc import imread, imsave, imresize

img = imread('assets/cat.jpg')
print img.dtype, img.shape  # Prints "uint8 (400, 248, 3)"

img_tinted = img * [1, 0.95, 0.9]

# Resize the tinted image to be 300 by 300 pixels.
img_tinted = imresize(img_tinted, (300, 300))

# Write the tinted image back to disk
imsave('assets/cat_tinted.jpg', img_tinted)

matlab檔案

函式scipy.io.loadmatscipy.io.savemat能夠讓你讀和寫MATLAB檔案。