Numpy 常用語法


Posted by pei_______ on 2022-06-23

numpy的特色

  1. 用陣列代替列表處理資料
  2. 適合處理多維度的資料
  3. pandas、tensorflow的基礎
  4. 運算速度遠高於列表(核心使用C、C++運作)

一、資料建立


01. numpy.array

# 一維資料

data = np.array([3, 4, -5])

# 二維資料

data = np.array([
    [1, 2], 
    [3, 2], 
    [4, 0]
])

# 三維資料

data = np.array([
    [
        [5, 2, 4], [1, 2, 8],
    ],
    [
        [3, 8, 2], [4, 3, 1]
    ]
])

02. numpy.empty / zeros / ones / arange

# 建立空白資料
data = np.empty(3)

# 建立全0的資料
data = np.zeros([3, 2])

# 建立全1的資料
data = np.ones([2, 2, 2])

# 建立範圍(a ~ b-1)的資料
data = np.range(a, b)

二、資料運算


01. 逐元運算 (兩個數據的數量及維度要相同)

data1 = np.array([3, 2, 10])
data2 = np.array([1, 3, 6])

data1 + data2
data1 - data2
data1 * data2
data1 / data2
data1 > data2
data1 == data2

02. 矩陣運算

'''
# 內積矩陣運算 (第一個矩陣後面維度 = 第二個矩陣前面維度)

| 1 |   | 1 5 |   | 16 | (1 * 1 + 3 * 5)
| 3 | x | 4 2 | = | 10 | (1 * 4 + 3 * 2)
        | 5 2 |   | 11 | (1 * 5 + 3 * 2)

 1x2  X   2x3   =   1x3         
'''

data1 = np.array([
    [1, 3]
])

data2 = np.array([
    [1, 4, 5],
    [5, 2, 2]
])

# 內積 (得到 1 x 3矩陣)
result = data1.dot(data2)
result = data1 @ data2
'''
# 外積矩陣運算
| 1  4  5  5  2  2 | ( 1 * 所有)
| 3 12 15 15  6  6 | ( 3 * 所有)

 1x2  X   2x3   =   2x6
'''

# 外積 
result = np.outer(data1, data2)

03. 統計運算 (只要一個多維資料即可)

data = np.array([
    [2, 1, 7],
    [-5, 3, 8]
])

print(f"全部加總: {data.sum()}")
print(f"找到最大值: {data.max()}")
print(f"找到最小值: {data.min()}")
print(f"平均數: {data.mean()}")
print(f"標準差: {data.std()}")
print(f"針對第一個維度(column)做總和: {data.sum(axis=0)}")
print(f"針對第二個維度(row)做總和: {data.sum(axis=1)}")
print(f"逐值累加: {data.cumsum()}")

三、資料形狀 Shape / T / reShape


import numpy as np
'''
維度 Dimension: 資料的層次 ex. 1, 2, 3
形狀 Shape: 表達資料的層次和各層次的資料數量 ex. [8], [2,4], [2, 2, 2]
'''

data = np.array([[1, 2], [3, 2], [4, 0]])

# 觀察資料形狀 (3 x 2)
print(data.shape)

# 轉置資料 (2 x 3), 常用在矩陣
print("--- 轉置前 ---")
print(data)
print("--- 轉置後 ---")
print(data.T)

# 扁平化 => 打平成一維資料 (1 x 7)
print(data.ravel())
print(data.ravel().shape)

# 重塑資料 => 重塑前後的資料總數要一致
shape1 = np.array([1, 2, 3, 4, 5, 6, 7, 8])
shape2 = shape1.reshape(4, 2)

# 亦可用在資料初始化
initialize = np.zeros(18).reshape(2, 3, 3)
print(initialize)

四、資料索引 Index & 資料切片 Slice


import numpy as np

data = np.array([
    [1, 3, -1],
    [1, 2, 3],
    [5, -5, 3],
    [3, 5, 1]
])

# 索引 Index (從0開始)
index_data = data[1, 2]

# 切片 Slice (包含前面,不包含後面)
# ex. [a:b] 擷取 a ~ b-1
# ... 表示都要
slice_data = data[..., 2:4]  # 保留前面全部的層次

五、合併矩陣 vStack & hStack


import numpy as np

# 合併第一個維度
# np.vstack((陣列一, 陣列二, ...))

# 合併第二個維度
# np.hstack((陣列一, 陣列二, ...))

arr1 = np.array([[1, 2, 3], [4, 5, 6]])  # 2 x 3
arr2 = np.array([[7, 8, 9], [10, 11, 12]])  # 2 x 3
arr3 = np.array([[13, 14], [15, 16]])  # 2 x 2
result1 = np.vstack((arr1, arr2))  # 合併第一個維度: '4' x 3
result2 = np.hstack((arr1, arr2, arr3))  # 合併第二個維度: 2 x '8'
print(result1)  # [[1 2 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
print(result2)  # [[1, 2, 3, 7, 8, 9, 13, 14], [4, 5, 6, 10, 11, 12, 15, 16]]

六、切割矩陣 vSplit & hSplit


import numpy as np

# 切割第一個維度
# np.vsplit(陣列, 切割數量)

# 切割第二個維度
# np.hsplit(陣列, 切割數量)

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

result1 = np.vsplit(arr1, 1)  # 切割第一個維度成1個: 2 x 4
result2 = np.vsplit(arr1, 2)  # 切割第一個維度成2個: 1 x 4 + 1 x 4
result3 = np.hsplit(arr1, 1)  # 切割第二個維度成1個: 2 x 4
result4 = np.hsplit(arr1, 2)  # 切割第二個維度成2個: 2 x 2 + 2 x 2
result5 = np.hsplit(arr1, 4)  # 切割第二個維度成4個: 2 x 1 + 2 x 1 + 2 x 1 + 2 x 1









Related Posts

Git筆記 branch / merge

Git筆記 branch / merge

Linkedin Java 技術認證題庫  日期/ 建構子

Linkedin Java 技術認證題庫 日期/ 建構子

在 Ethereum 上開發簡單的 Todo App

在 Ethereum 上開發簡單的 Todo App


Comments