Python科學計算----Numpy
目錄
Numpy 是一個專門用於矩陣化運算、科學計算的開源Python
NumPy將Python相當於變成一種免費的更強大的Matlab系統
(1)強大的 ndarray 多維數組結構
(2)成熟的函數庫
(3)用於整合C/C++和Fortran代碼的工具包
(4)實用的線性代數、傅里葉變換和隨機數模塊
(5)Numpy 和稀疏矩陣運算包scipy 配合使用非常方便
1、基本數據結構 ndarray
矩陣表示:使用Numpy,易得到二維矩陣
# 導入numpy
import numpy as np
# 構建多維數組
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
print(type(arr))
# 結果
[[1 2 3]
[4 5 6]]
<class 'numpy.ndarray'>
# 獲取數據
print(arr[0]) # [1 2 3]
# 修改數據
arr[0] = 0
print(arr)
# 結果
[[0 0 0]
[4 5 6]]
# 切片
# 取出第二列 ::表示所有行
print(arr[::, 1]) # [0 5]
# 重新賦值
# 從開頭到第二列賦值為0
arr[:, :2] = 0
print(arr)
# 結果
[[0 0 0]
[0 0 6]]
2、切片索引、布爾索引
# 導入numpy
import numpy as np
# 定義一個Numpy
arr = np.array(
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
)
# 切片索引
# 取出矩陣中的5
print(arr[1, 1])
# 取出矩陣中的3、6、9
print(arr[::, 2]) # 所有行、第3列
# 取出123、789
print(arr[::2, ::]) # 行步長為2、列從頭到尾
============================================================
# 布爾索引, 返回為true位置的數據
# 取出大於4的數據
print(arr[arr > 4]) # [5 6 7 8 9]
# 取出矩陣中的奇數
print(arr % 2 == 1)
# 結果
[[ True False True]
[False True False]
[ True False True]]
# 對ndarray的計算相當於是對里面的數據的計算
print(arr[arr % 2 == 1])
# [1 3 5 7 9]
===========================================================
# 計算
# 計算
arr = np.array(
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
)
print(arr ** 2 - 1)
# 結果
[[ 0 3 8]
[15 24 35]
[48 63 80]]
3、對位運算
# 導入numpy
import numpy as np
arr1 = np.array([[1, 1, 1], [2, 2, 2]])
arr2 = np.array([[3, 3, 3], [4, 4, 4]])
# 對應位置進行計算
print(arr1 + arr2)
# 結果
[[4 4 4]
[6 6 6]]
print(arr1 - arr2)
# 結果
[[-2 -2 -2]
[-2 -2 -2]]
print(arr1 * arr2)
# 結果
[[3 3 3]
[8 8 8]]
print(arr1 / arr2)
# 結果
[[0.33333333 0.33333333 0.33333333]
[0.5 0.5 0.5 ]]
# 整除//
print(arr1 // arr2)
# 結果
[[0 0 0]
[0 0 0]]
# 取余
print(arr1 % arr2)
# 結果
[[1 1 1]
[2 2 2]]
print(arr1 ** arr2)
# 結果
[[ 1 1 1]
[16 16 16]]
4、重構---通過 reshape 方法將所有元素按照指定行指定列進行重構
# 導入numpy
import numpy as np
arr1 = np.array([[1, 1, 1], [2, 2, 2]])
# 重構
# 本次定義的矩陣只能重構成3行2列、2行3列、1行6列、6行1列
print(arr1.reshape((3, 2)))
# 結果
[[1 1]
[1 2]
[2 2]]
print(arr1.reshape((2, 3)))
print(arr1.reshape((6, 1)))
print(arr1.reshape((1, 6)))
5、拼接
通過 vstack 沿縱軸拼接
通過 hstack 沿橫軸拼接
通過 concatenate 進行拼接
# 導入numpy
import numpy as np
arr1 = np.array([[1, 1, 1], [2, 2, 2]])
arr2 = np.array([[3, 3, 3], [4, 4, 4]])
# 縱向拼接
print(np.vstack((arr1, arr2)))
# 結果
[[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]]
# 橫向拼接
print(np.hstack((arr1, arr2)))
# 結果
[[1 1 1 3 3 3]
[2 2 2 4 4 4]]
6、轉置、翻轉
# 導入numpy
import numpy as np
arr1 = np.array([[1, 1, 1], [2, 2, 2]])
arr2 = np.array([[3, 3, 3], [4, 4, 4]])
print(arr1)
# 結果
[[1 1 1]
[2 2 2]]
# 將arr1轉置
print(arr1.T)
# 結果
[[1 2]
[1 2]
[1 2]]
# 將arr1左右翻轉
print(np.fliplr(arr1))
# 結果
[[1 1 1]
[2 2 2]]
# 將arr1上下翻轉
print(np.flipud(arr1))
# 結果
[[2 2 2]
[1 1 1]]
7、內置操作函數
1、數學函數
numpy.log()函數是numpy模塊提供的現成自然對數函數
# 導入numpy
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
# 自然對數
print(np.log(arr1))
# 結果
[[0. 0.69314718 1.09861229]
[1.38629436 1.60943791 1.79175947]]
2、運算函數
在計算的時候,會用到差分、累加的情況。Numpy提供很多相關的運算函數
# 導入numpy
import numpy as np
arr1 = np.array([1, 4, 6, 8, 0, 1])
# 差分:兩數之間取差
print(np.diff(arr1))
# 結果
[ 3 2 2 -8 1]
對於二維矩陣,需要指明是對哪一個維度進行差分
# 導入numpy
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
# axis :方向 axis=0 縱向,axis=1 橫向
print(np.diff(arr1, axis=1))
# 結果
[[1 1]
[1 1]]
3、統計函數
numpy提供了很多計算最大值、最小值、均值、中位數等統計量的函數,
比如統計最大值的函數numpy.amax()
# 導入numpy
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.amax(arr1, axis=1)) # 最大值
# 結果
[3 6]
print(np.std(arr1, axis=1)) # 標准差
# 結果
[0.81649658 0.81649658]
8、隨機模塊random
• 偽隨機數的產生,可從離散分布和連續分布中產生
• 在蒙特卡洛方法、隨機積分、隨機過程模擬等很多方面都有應用
• 指定隨機種子(seed)產生相同的隨機數序列
9、常用分布的產生方式
# 導入numpy
import numpy as np
# 隨機生成滿足10乘5的正太分布數據
print(np.random.normal(size=(10, 5)))
# 結果
[[ 0.32878953 0.71197857 1.4588738 1.31069034 -1.17416894]
[ 1.02082204 1.41527355 -0.28873512 -0.98912335 -1.25771646]
[-1.27440505 2.84689987 -0.70494075 0.05973663 -0.52115097]
[ 0.32383528 0.04148195 0.73268786 -0.0838266 0.3542903 ]
[-1.80250937 0.16319989 -0.85771618 -0.08209453 0.64317038]
[ 0.22995207 -0.11308609 1.85361257 0.61643364 0.69046163]
[-1.02848903 -0.85376927 1.30259009 -0.56901766 -0.36592106]
[-1.19991749 0.85722885 -0.15820272 -1.11556772 -0.55697908]
[ 0.87993598 -0.87994843 0.19990547 1.92109329 -1.29323607]
[-0.40084441 0.57890668 -0.65851584 -0.19371564 -0.26126436]]