NumPy 是 Python 科學計算核心套件,提供高效能多維陣列物件 ndarray、向量化運算、線性代數、隨機數生成等功能。本文涵蓋安裝、IPython 互動環境、陣列核心操作、組合分割、屬性存取、檔案 IO 及常用統計函數,附完整 IPython 實戰紀錄可直接複製執行。
# 使用 pip 安裝(建議虛擬環境)
pip install numpy
# 安裝 IPython 互動式 shell(支援 Tab 補全、語法高亮)
pip install ipython
# 啟動 pylab 模式(自動匯入 numpy, matplotlib, scipy)
ipython --pylab
In [1]: a = arange(5) # 建立 0~4 一維陣列
In [2]: a.dtype # 資料型別
Out[2]: dtype('int64')
In [3]: a.shape # 維度形狀 (tuple)
Out[3]: (5,)
In [6]: m = array([[1, 2], [3, 4]]) # 巢狀列表建立二維陣列
In [7]: m
Out[7]:
array([[1, 2],
[3, 4]])
In [10]: m.shape
Out[10]: (2, 2)
In [14]: m[0, 0] # 多維索引(逗號分隔)
Out[14]: 1
In [15]: m[0, 1]
Out[15]: 2
In [16]: a[2:4] # 切片 [2, 3]
Out[16]: array([2, 3])
In [18]: a[2:5:2] # 步長 2
Out[18]: array([2, 4])
In [19]: a[::-1] # 反轉陣列
Out[19]: array([4, 3, 2, 1, 0])
In [20]: b = arange(24).reshape(2, 3, 4) # 重塑為 2x3x4
In [21]: b.shape
Out[21]: (2, 3, 4)
In [22]: b
Out[22]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [23]: b[1, 2, 3] # 取特定元素
Out[23]: 23
In [24]: b[:, 0, 0] # 冒號忽略維度
Out[24]: array([ 0, 12])
In [24]: b[..., 0, 0] # 省略號 ... 等同多個冒號
Out[24]: array([ 0, 12])
In [26]: b.ravel() # 展平(回傳視圖,不複製記憶體)
Out[26]: array([ 0, 1, ..., 23])
In [27]: b.flatten() # 展平(複製新記憶體)
Out[27]: array([ 0, 1, ..., 23])
In [30]: b.shape = (6, 4) # 直接修改 shape 屬性
In [31]: b
Out[31]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
...
[20, 21, 22, 23]])
# 轉置
In [18]: b.T
Out[18]:
array([[ 0, 4, 8, 12, 16, 20],
[ 1, 5, 9, 13, 17, 21],
[ 2, 6, 10, 14, 18, 22],
[ 3, 7, 11, 15, 19, 23]])
In [1]: a = arange(9).reshape(3, 3)
In [2]: a
Out[2]: array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
In [3]: b = a * 2
In [4]: b
Out[4]: array([[ 0, 2, 4], [ 6, 8, 10], [12, 14, 16]])
In [5]: hstack((a, b)) # 水平堆疊 (axis=1)
Out[5]: array([[ 0, 1, 2, 0, 2, 4], ...])
In [6]: vstack((a, b)) # 垂直堆疊 (axis=0)
Out[6]: array([[ 0, 1, 2], ..., [12, 14, 16]])
In [7]: dstack((a, b)) # 深度堆疊 (axis=2)
Out[7]: array([[[ 0, 0], [ 1, 2], [ 2, 4]], ...])
In [9]: hsplit(a, 3) # 水平分割成 3 等份
Out[9]: [array([[0],[3],[6]]), array([[1],[4],[7]]), array([[2],[5],[8]])]
In [10]: vsplit(a, 3) # 垂直分割成 3 等份
Out[10]: [array([[0,1,2]]), array([[3,4,5]]), array([[6,7,8]])]
In [12]: a.ndim # 維度數 (秩)
Out[12]: 2
In [13]: a.size # 元素總數
Out[13]: 9
In [14]: a.itemsize # 單一元素位元組數
Out[14]: 8
In [15]: a.nbytes # 總記憶體位元組數
Out[15]: 72
In [18]: a.T # 轉置
Out[18]: array([[0, 3, 6], [1, 4, 7], [2, 5, 8]])
In [19]: a.tolist() # 轉為 Python 巢狀列表
Out[19]: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
In [22]: c = eye(2) # 2x2 單位矩陣
In [23]: c
Out[23]: array([[1., 0.], [0., 1.]])
In [25]: savetxt("eye.txt", c) # 存檔
# 載入 CSV 指定欄位
In [5]: c, v = loadtxt("test.csv", delimiter=",", usecols=(0,1), unpack=True)
In [12]: c
Out[12]: array([1., 4., 7.])
In [13]: mean(c) # 平均值
Out[13]: 4.0
In [14]: np.max(c) # 最大值
Out[14]: 7.0
In [15]: np.min(c) # 最小值
Out[15]: 1.0
In [16]: np.ptp(c) # 峰峰值 (max-min)
Out[16]: 6.0
In [18]: np.median(c) # 中位數
Out[18]: 4.0
In [19]: np.var(c) # 變異數
Out[19]: 6.0
In [20]: np.diff(c) # 相鄰差分
Out[20]: array([3., 3.])
In [21]: np.std(c) # 標準差
Out[21]: 2.449...
In [22]: np.where(c > 3) # 條件索引
Out[22]: (array([1, 2]),)
a * 2 + b)ravel()、切片、reshape() 多為視圖,修改會影響原陣列dtype 節省記憶體(如 float32, int16)np.random 提供更豐富分布、向量化生成