【Python 學習筆記】系列文預計會有 10 篇文,會從最基礎的 Python 簡介開始,再到迴圈、if 判斷式等基礎程式語法,最後會利用 Python 豐富的套件,學習 pillow 圖片處理、matplotlib 繪製圖表、scrapy 爬蟲等功能。之後會再慢慢更新吧 XDD
標題訂為「學習筆記」是因為我也是 Python 的初學者,之前雖有寫 C 語言的經驗,但是上完課後就幾乎沒有再使用,想藉由寫學習筆記的系列文,要求自己複習上課學到的 Python 的語法,希望有朝一日能將 Python 變為自己的「第三外語」。
上一篇 Python 學習筆記:
【Python 學習筆記】系列文的內容大多參考《第一次學 Python 就上手》這本書,所以想要自學 Python 的人可以將這本書列為你的 Python 入門參考書!
模組 Module
模組(module),是一個名稱為 modulename.py 的檔案,檔案內定義了一些資料、函式或類別。
如果想要使用一個模組,會用 import modulename
匯入模組。平常我們使用、存取的檔案都在 python 的資料夾下。
import os print(os.__file__)
C:\Users\User Name\Anaconda3\lib\os.py
import modulename as alias alias.method()
之前也使用過這個語法,目的是為了將冗長的 modulename 換成比較簡短、自己也比較清楚的名字,例如說, import random as rd
就是一個例子。 alias
只是個別名而已。
from modulename import classname/methodname methodname()
這個語法只把模組內的某些方法或類別導入,除了那些有特別導入的內容外,其他方法不會導入。用這個方法就可以不用在 methodname 前面加 modulename.
了!
如果想要引用模組內的全部類別與方法,也可以用 *
,但是對 Python 的負擔比較大,所以盡量別用。
dir()
dir()
會傳會傳回目前存取範圍內的名稱,這些名稱前面不加 xxx. 也不會錯。Import 後,會出現 import 後的名稱,可以用來確認是不是已經 import 了。
套件 Package
套件中存放了多個模組,就像一個資料夾存放了很多檔案一樣。只要有 __init__.py
檔案的資料夾就會被視為 python 套件。
標準函式庫(standard library)/內建函式庫(built-in library)是安裝 python 時一併安裝的套件。如:math, random, time, calendar, datetime, turtle。
外部函式庫(external library)是需要另外安裝的模組與套件。
import importlib as imp print(imp.util.find_spec('numpy'))
ModuleSpec(name=’numpy’, loader=<_frozen_importlib_external.SourceFileLoader object at 0x000001B5B2EC57B8>, origin=’C:\\Users\\User Name\\Anaconda3\\lib\\site-packages\\numpy\\__init__.py’, submodule_search_locations=[‘C:\\Users\\User Name\\Anaconda3\\lib\\site-packages\\numpy’])
利用上面的程式碼,可以尋找已經安裝的套件的儲存地點。
第三方套件 Third Party Package
▸Django, Web2py, Flask:web框架,快速架設網站 ▸Numpy:陣列與科學計算;矩陣運算、FFT、線性代數 ▸SciPy:科學計算 ▸Pandas:數據處理與資料分析 ▸Matplotlib:2D視覺化工具 ▸PyGtk, PyQt, WxPython, tkinter:GUI程式開發 ▸BeautifulSoup:HTML/XML解析器 ▸Pillow/PIL(舊):圖形處理 ▸PyGame:多媒體與遊戲開發 ▸Requests:存取網際網路資料 ▸Scikit-learn:機器學習套件 ▸Scrapy:網路爬蟲工具
如何安裝上述這些第三方套件呢?
首先,要先確認 Python 已在 Windows 的環境變數中。
有兩種方法:
- 自行到環境變數中的 PATH 加上 Python 執行檔的路徑
- 下載 Python 安裝檔,執行,再勾選添加 Python 到環境變數(Add Python 3.7 to PATH)。
用 PIP 安裝第三方套件
PIP 是 Python 中的套件管理工具,可以用來查看、安裝、升級、解除安裝與管理套件。用 PIP 套件需要在環境變數內加上 Python,最簡單的方式是點開安裝檔,再打勾。
有關 PIP 的指令:
pip list
:可以用來列出目前安裝的套件與版本。
pip install 套件名稱
:可以用來安裝套件。
pip show 套件名稱
:可以用來查詢已安裝的套件。
pip uninstall 套件名稱
:解除安裝套件。
用 PYPI 安裝第三方套件
首先先到 pypi.org 這個網址,利用指令搜尋想要的套件,再進行安裝。
如果是在 Jupyter Notebook 裡面安裝第三方套件,記得在指令前加上 !
,例如 !pip install scrapy
。Jupyter Notebook 內建會額外安裝一些常用的套件例如 numpy, matplotlib 等。
NumPy
NumPy 是 Numeric Python 的簡寫,是一個陣列處理套件,支援多維陣列與矩陣運算。若讀者對這些子套件有興趣,可以到 NumPy 官方網站(http://www.numpy.org/)查詢。
NumPy 的陣列
陣列(array)是一種資料結構,與 list 非常類似,可以存放元素(element),裡⾯有各自的值(value),有索引去區分每個元素在哪。
同質陣列(homogeneous array)是指每個元素都是同樣型別的陣列,可以依據維度分為一維陣列(1-dimensional array)多維陣列列(multi-dimensional array)。
numpy 裡的 ndarray(n-dimensional array)是同質的⼀維或多維陣列,使用 numpy.array() 可以宣告這種陣列,宣告方式跟 list() 類似。
import numpy A = numpy.array([10, 20, 30])
ndarray.ndim
:陣列維度。
ndarray.shape
:陣列的形狀,整數 tuple 代表每個維度的元素個數。
ndarray.size
:陣列的元素個數。
ndarray.dtype
:陣列的元素類別,可以是 int, float, bool, str 或者 Numpy 的 numpy.int32, numpy.int16, numpy.float64 等。
ndarray.itemsize
:陣列內每個元素的大小,int32=32 位元(bit)=32/8 位元組=4 位元組(byte)。
ndarray.data
:真正包含資料的緩衝區。
dtype 可以拿來指定資料型別(避免錯誤植入),或協助轉換(需要是broadcastable)。
import numpy as np int_array = np.array([1.0,2.0,True],dtype=float) int_array.dtype
dtype(‘float64’)
Arange
import numpy as np A = np.arange([start,] stop [, step, dtype = None])
與 range()
非常相似,只是是回傳一個 ndarray。
start
:起始值,可不填,預設為 0。
stop
:終止值,需要提供,且不包含 stop 的值。
step
:每個值中間間隔多少,預設為 1,有提供 step 就要有 start。
dtype
:資料的型別,不提供的話,numpy 會根據輸入⾃動辨別。
A = np.arange(50) print(A)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
48 49]
Linspace
import numpy as np A = np.linspace(start, stop [, num, endpoint = True, retstep = False, dtype = None)
回傳將 start-stop 的數字切成 num 個的 ndarray。
num
:將這段數字切成多少個,預設 50。
endpoint
:預設為 True,即包含 stop,如果為 False 則 start-stop 取 num+1 個。
restep
:回傳使用的 step,True 會回傳。
dtype
:資料的型別,不提供的話,numpy 會根據輸入⾃動辨別。
B = np.linspace(0, 100, 50, retstep = True, dtype=int) print(B)
(array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 51,
53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77,
79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 100]), 2.0408163265306123)
Concatenate
import numpy as np
A = np.array([10, 20]) B = np.concatenate((A, A)) #[10, 20, 10 ,20] C = np.concatenate((A, [30]) #[10, 20, 30]
concatenate((陣列1, 陣列2))
,回傳兩個陣列接在一起後的結果,注意有兩層 (())
。
NumPy 的運算
以下都回傳一個 numpy.ndarray / scalar(當兩個都不是陣列的時候):
add(x1, x2)
:加法,x1+x2。
subtract(x1, x2)
:減法,x1-x2。
multiply(x1, x2)
:乘法,x1*x2。
divide(x1, x2)
:除法,x1/x2。
mod(x1, x2)
:餘數,x1%x2。
power(x1, x2)
:冪次,x1**x2。
isfinite(x)
:傳回參數 x 是否為有限。
isinf(x)
:傳回參數 x 是否為無限。
isnan(x)
:傳回參數 x 是否為 NaN(Not a Number)。
sign(x)
:負數回傳 -1,正數回傳 1,0 回傳 0。
negative(x)
:傳回 x 的負數。
absolute(x)
:傳回 x 的絕對值。
sum(x)
:回傳 x 的總和。
max(x)
:回傳 x 中的最大值。
argmax(x)
:回傳 x 中的最大值的索引。
min(x)
:回傳 x 中的最小值。
argmin(x)
:回傳 x 中的最小值的索引。
floor(x)
:回傳 x 的地板(⼩數點無條件捨棄)。
sqrt(x)
:回傳 x 的平方根。
square(x)
:回傳 x 的平方。
exp(x)
:回傳自然對數 e 的 x 次方。
exp2(x)
:回傳 2 的 x 次⽅。
log(x)
:回傳 x 取⾃然對數 e 的結果。
log2(x)
:回傳 x 取底數為 2 的對數的結果。
log10(x)
:回傳 x 取底數為 10 的對數的結果。
sin(x), cos(x), tan(x), acos(x), asin(x), atan(x)
:三角函數,注意 x 是弧度。
mean(x)
:回傳 x 的平均值。
median(x)
:回傳 x 的中位數。
std(x)
:回傳 x 的標準差。
二維陣列
二維陣列是一維陣列的延伸,如果說一維陣列是呈線性的一度空間,那麼二維陣列就是平面的二度空間。
初始化的時候就是二維的 list 或者 tuple。
np.array([[95, 100, 100], [86, 90, 75]]) #2*3的二維陣列
也可以使用 reshape()
回傳形狀為 newshape
的新陣列。
numpy.reshape(a, newshape, order)
a
:輸入的陣列。
newshape
:新的形狀,應該要是 int 或者 int tuple。新形狀咬與原本的形狀可以轉化,例如說 13 個無法轉成 4*3 的陣列。如果使用 ndarray.reshape 的話 tuples 可以沒有 ()
。
A = np.array([1,2,3,4,5,6,7,8,9,10,11,12]).reshape(4,3)
numpy.append(x1, x2 [, axis])
axis
:要在第幾個維度將 x1, x2 併在一起,如果沒有提供的話,陣列會先被攤平再合在一起。
另外,值得注意的是,NumPy 中 a=b,如果更改任何一個其他也會跟著改變,記得用 a=b.copy()。
numpy.dot(x1, x2)
:可以處理矩陣乘法,也可以用 x1@x2
。
numpy.insert(array, index, value, axis)
index
:插入的索引位置。
value
:插入的值,多個的話可以插入 list。
axis
:插入的維度,不指定會把原本的 array 攤平。
broadcast numpy:會努力把插入的值,調整到可以盡可能符合維度形狀的長度。
import numpy as np a = np.array([[1,2],[3,4],[5,6]]) print(a.T) #轉置矩陣的語法 print(‘Original array:\n’, a)
print(‘Axis parameter not passed. The input array is flattened before insertion.’) print(np.insert(a,3,[11,12]) )
print(‘Axis parameter passed. The values array is broadcast to match input array.’) print(‘Broadcast along axis 0:\n’,np.insert(a,1,[11],axis = 0) ) print(‘Broadcast along axis 1:\n’, np.insert(a,1,11,axis = 1) )
[[1 3 5]
[2 4 6]]
Original array:
[[1 2]
[3 4]
[5 6]]
Axis parameter not passed. The input array is flattened before insertion.
[ 1 2 3 11 12 4 5 6]
Axis parameter passed. The values array is broadcast to match input array.
Broadcast along axis 0:
[[ 1 2]
[11 11]
[ 3 4]
[ 5 6]]
Broadcast along axis 1:
[[ 1 11 2]
[ 3 11 4]
[ 5 11 6]]
np.clip(array, array_min, array_max)
np.clip(a, 0, 999)
array([[1, 2],
[3, 4],
[5, 6]])
np.reshape()
a = np.array(range(12)) a.reshape((12))
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
其他的初始化方式:
a = np.zeros((4,3)) b = np.ones((2,6)) c = np.full((3,3),-1)
print(a) print(b) print(c)
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1.]]
[[-1 -1 -1]
[-1 -1 -1]
[-1 -1 -1]]
文章看到這裡的妳/你,如果覺得我的文章有幫助,可以幫我點下方的 Likecoin 五下!
謝謝妳/你支持創作者!
https://button.like.co/b04602009
可以點選【我的推薦連結】創辦一個 Likecoin 的帳號,你也可以因此獲得 8 個 Likecoin!
Pandas
Pandas 是基於 NumPy 建構的套件。那與 NumPy 的差別為何?
NumPy 主要資料結構是 Ndarray,類似 list;而 Pandas 主要資料結構是 Series 和 DataFrame,類似 dict。
Series:有索引的陣列,預設索引 0~N-1 DataFrame:表格型的數據結構,預設索引也是 0~N-1
Series
import pandas as pd A = pd.Series([1,3,5,12,5])
0 1
1 3
2 5
3 12
4 5
dtype: int64
A = pd.Series([1,2,3,None,3],['a','b','c','d','e']) print(A)
B = pd.Series(['a','b','c','d','e'],[1,2,3,None,3]) print(B)
C = pd.Series(['a','b','c','d','e']) print(C)
a 1.0
b 2.0
c 3.0
d NaN
e 3.0
dtype: float64
1 a
2 b
3 c
NaN d
3 e
dtype: object
0 a
1 b
2 c
3 d
4 e
dtype: object
DataFrame
import pandas as pd import numpy as np
dates = pd.date_range('20160101',periods=6, freq='w-MON') print(dates) col = ['a','b','c','d'] data = np.random.randn(6,4) df = pd.DataFrame(data, index=dates, columns=col) print(df)
#為求美觀,所以以等寬字型輸出結果
DatetimeIndex(['2016-01-04', '2016-01-11', '2016-01-18', '2016-01-25','2016-02-01', '2016-02-08'], dtype='datetime64[ns]', freq='W-MON') #freq表示以每周一為間隔 a b c d 2016-01-04 0.744791 -0.373153 0.982891 0.333078 2016-01-11 0.360187 -0.406994 0.515021 -0.206013 2016-01-18 0.415132 1.757737 -1.286703 0.978017 2016-01-25 1.050627 0.009218 -0.785219 -0.310091 2016-02-01 -0.734791 0.201462 1.467542 -0.709621 2016-02-08 -0.067650 2.280087 -1.578596 -0.619466
df.columns df.index df['b']
#為求美觀,所以以等寬字型輸出結果
2016-01-04 -0.373153 2016-01-11 -0.406994 2016-01-18 1.757737 2016-01-25 0.009218 2016-02-01 0.201462 2016-02-08 2.280087 Freq: W-MON, Name: b, dtype: float64
df2 = pd.DataFrame({‘A’ : [1,2.5,32,None],\ ‘B’ : pd.Timestamp(‘20130102’),\ ‘C’ : pd.Series(1,index=list(range(4)),dtype=’float32'),\ ‘D’ : np.array([3] * 4,dtype=’int32'),\ ‘E’ : pd.Categorical([“test”,”train”,”test”,”train”]),\ ‘F’ : ‘foo’}) df2
df2.describe()
DataFrame 資料篩選
#loc是標籤 df.loc[:,['a','c']]
#iloc是標籤的索引 df.iloc[[1,3],[0,1,3]]
df[df.a>0.3] #[]內放bool判斷
pd.dropna()
:去掉所有 NA 或 NaN 的欄或列。
pd.fillna(value = 0)
:將所有 NA 或 NaN 的資料取代為 value
。
pd.isnull()
:去掉所有 NA 或 NaN 的資料取代為是不是 null。
DataFrame 資料合併
pd.concat([df1,...], axis = 0 [, ignore_index = False, join = 'outer'])
ignore_index
:重置 index(重新給 index)。
join = 'outer'
:如果沒有的欄位就填 NaN。
join = 'inner'
:如果沒有的欄位就不顯⽰。
axis
:根據 0, 1 決定哪個維度會合併。
pd.append(...)
只有縱向合併
pd.merge(left, right, on = [key, ...], how = 'inner')
根據 on 的 key 值,將 left 與 right 合併。
how = 'inner'
:沒有的欄位不顯⽰。
how = 'outer'
:沒有的欄位顯示 NaN。
how = 'left'
:left 的資料保留,right 沒有的欄位顯示 NaN。
how = 'right'
:right 的資料保留,left 沒有的欄位顯示 NaN。
謝謝看到最後的你
如果你覺得這篇文章不錯,請不吝給我 1~10 個掌聲(Claps);
如果你喜歡這篇文章,也歡迎分享到社群媒體給更多的朋友與持續關注我的最新文章。
【Python 學習筆記】系列文連結:
1. 學習筆記 #001:輸出、輸入、型別介紹、運算子 2. 學習筆記 #002:數值處理、字串處理、選擇結構 3. 學習筆記 #003:選擇結構、迴圈結構 4. 學習筆記 #004:While 迴圈、Break and Continue、函式 Function 5. 學習筆記 #005:遞迴關係式、串列 List、List 函式、List 的處理方法 6. 學習筆記 #006:序對 Tuple、集合 Set 與字典 Dict 的介紹與使用方法 7. 學習筆記 #007:物件導向、檔案存取 8. 學習筆記 #008:模組、套件、NumPy 與 Pandas 9. 學習筆記 #009:Scrapy 網路爬蟲、CSV 模組、用 Pandas 讀取 CSV、Matplotlib 畫出各種圖形 10.學習筆記 #010:用 TK Inter 模組開始設計自己的程式介面吧!