9.1 Numpy庫的使用

一、Numpy庫介紹

Numpy是Python的一種開源的數值計算擴展,可以用來存儲和處理大型矩陣,比Python自帶的嵌套列表結構要高效的多。

可以實現的功能:

  • 1、一個強大的N維數組對象Array;
  • 2、比較成熟的函數庫;
  • 3、用於整合C/C++和Fortran代碼的工具包;
  • 4、使用的線性代數、傅里葉變換和隨機數生成函數;
  • 5、numpy和稀疏矩陣運算包scipy配合使用更加方便;
  • 6、numpy內置了並行運算功能,當系統有多個核心時,做某種計算時,numpy會自動做並行運算。

二、Numpy庫的使用

1、array的創建

import numpy as np#導入numpy庫的包
'''中括號[]的個數代表的矩陣的維度,dtype定義矩陣中元素的類型'''
c = np.array([[1,2,3],
             [4,5,6],
             [7,8,9]],dtype=int32)
'''生成一些特殊的矩陣'''
zero = np.zeros((3,4))#生成3行四列的一個矩陣
ones = np.ones((2,3))#生成2行3列全爲1的矩陣
e = np.arange(10)
f = np.arange(2,11,3)#使用range方法生成矩陣
'''重新定義矩陣的形狀,將矩陣轉換爲3行4列的矩陣'''
h = np.arange(12).reshape(3,4)

2、numpy的運算

arr1 = np.array([[1,2,3],
                [5,6,7]])
arr2 = np.array([[2,2,2],
                [3,3,3]])

矩陣之間的加減乘除、取餘、整除和乘方的運算規則是按位運算的,矩陣的行列數要相同,例如:

print(arr1 + arr2)
'''輸出結果爲:
[[ 3  4  5]
 [ 8  9 10]]'''

矩陣的乘法參考線性代數中矩陣乘法的運算規則:

arr5 = np.dot(arr1,arr4)
arr6 = arr1.dot(arr4)
print(arr5)
print(arr6)
'''arr5和arr6的輸出結構都爲:
[[ 6.  6.  6.  6.]
 [18. 18. 18. 18.]]'''

矩陣還可以進行判斷運算

arr3 = arr2 > 2
print(arr3)
'''arr2中大於2會輸出True,小於2會輸出False,所以輸出如下:
[[False False False]
 [ True  True  True]]'''

矩陣的轉置

'''一維的矩陣不能轉置,可以將矩陣增加一個唯獨後轉置'''
arr1_1 = arr1[np.newaxis,:]#增加一個維度
arr1.T	#轉置矩陣
'''atleast_2d代表至少2維的數據,如果不是二維矩陣會將arr1轉變爲二維矩陣'''
arr1_3 = np.atleast_2d(arr1)
print(arr1_3)

3、矩陣元素隨機生成以及矩陣自身的運算

'''生成3行2列從0到1的隨機數'''
sample1 = np.random.random((3,2))
'''生成3行2列符合標準正態分佈的隨機數'''
sample2 = np.random.normal(size=(3,2))
'''生成2行3列的1到10的隨機整數'''
sample3 = np.random.randint(1,10,size=(2,3))
np.sum(sample1)#求和,矩陣中所有的元素
np.min(sample3)#找到矩陣中最小的元素
np.max(sample3)#找到矩陣中最大的元素
np.sum(sample3,axis=0)#對列求和
np.sum(sample3,axis=1)#對行求和
np.argmin(sample3)#求最小值的索引(從0開始數)
np.argmax(sample3)#求最大值的索引(從0開始數)
#求矩陣中所有元素的平均值
np.mean(sample1)
sample1.mean()
np.median(sample3)#求矩陣中所有元素的中位數
np.sqrt(sample3)#求矩陣的開方
np.sort(sample4)#對矩陣進行升序排序
np.clip(sample4,2,7)#將矩陣中大於7的數變爲7,小於2的數變爲2,中間的數不變

4、numpy的索引

arr1 = np.arange(2,14)
print(arr1[2])
print(arr1[1:4])#輸出索引爲1到4
print(arr1[2:-1])
print(arr1[:5])#輸出索引0到5
arr2 = arr1.reshape(3,4)
print(arr2[2])#取索引爲2的行
print(arr2[1][2])#取索引爲1的行,索引爲2的列的數
print(arr2[:,2])#提取索引爲2的列

矩陣的迭代

for i in arr2:#按行迭代
    print(i)
for i in arr2.flat:#迭代所有元素
    print(i)

5、array的合併

arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr3 = np.vstack((arr1,arr2))#按行合併矩陣
arr4 = np.hstack((arr1,arr2))#按列合併矩陣
arr = np.concatenate((arr3,arrv),axis=0)#axis=0按行合併,axis=1按列合併

6、array的分割

arr1 = np.arange(12).reshape((3,4))
arr2,arr3 = np.split(arr1,2,axis=1)#將arr1按列切割爲兩個矩陣,第一部分存在arr2裏,arr3存在arr3中
'''有時候會出現矩陣在分割的時候,分割的個數與列數或者行數不同,可以用以下方法進行不平均分割'''
arr7,arr8,arr9 = np.array_split(arr1,3,axis=1)
arrv1,arrv2,arrv3 = np.vsplit(arr1,3)#vsplit代表按行分割
arrv1,arrv2 = np.hsplit(arr1,2)#hsplit代表按列分割

7、矩陣的淺拷貝和深拷貝

arr1 = np.array([1,2,3])
arr2 = arr1#arr1和arr2指向一個內存,淺拷貝
arr2[0] = 5 
print(arr1)
print(arr2)
'''輸出結果爲:
[5 2 3]
[5 2 3]'''

我們通過上面發現,arr2在改變的時候,arr1也會隨之改變,這是因爲arr1和arr2指向了一個內存,是屬於淺拷貝,如果我們指向改變arr2而不想改變arr1的值,可以進行深拷貝,如下所示

arr3 = arr1.copy()#深拷貝
arr3[0] = 10
print(arr1)
print(arr3)
'''輸出結果爲:
[5 2 3]
[10  2  3]'''
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章