文章目錄
-
- 科學計算工具numpy(下)
-
- 四、numpy的索引和切片
-
-
- 1.narray的基本索引與切片
- 2.narray的布爾型索引與切片
-
- 五、numpy的索引和切片
- 六、numpy的随機數生成
-
-
- 1.normal()
- 2.rand()
- 3.randn()
- 4.randint()
-
- 七、numpy的資料存儲
-
-
- 1.npy檔案
- 2.txt檔案
-
科學計算工具numpy(下)
四、numpy的索引和切片
1.narray的基本索引與切片
ndarray的基本索引與清單的索引與切片非常的類似:
# 着重讨論二維
ar = np.arange(20).reshape(4, 5)
print(ar)
print(ar[1:3][:])
print(ar[::2])
print("----")
# 另一種用逗号分割索引的方法, ar[a:b][c:d]與ar[a:b, c:d]等價
print(ar[2, 2]) # 逗号之前是行,逗号之後是列
print(ar[1:3, :])
#結果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[ 5 6 7 8 9]
[10 11 12 13 14]]
[[ 0 1 2 3 4]
[10 11 12 13 14]]
----
12
[[ 5 6 7 8 9]
[10 11 12 13 14]]
注意:narray的索引和清單類似也支援負值索引
eg:
ar = np.arange(10).reshape(2, 5)
print(ar)
print(ar[-1][-1])
# 結果:
[[0 1 2 3 4]
[5 6 7 8 9]]
9
2.narray的布爾型索引與切片
# 一維布爾型
ar = np.arange(20).reshape(4, 5)
print(ar)
i = [True, False, True, False]
j = [True, True, False, False, False] # 注意:這個i的元素個數與行數相同, j的元素個數與列數相同
print(ar[i, j]) # 列印行列都為True的元素組成的narray
print(ar[i]) # 等價于 print(ar[i,]) 等價于 print(ar[i, :]) -----列印為True的行
print(ar[:, j]) # 列印為True的列
print('-------')
# 二維布爾型
k = ar > 5
print(k)
print(ar[k]) # 等價于 ar[ar>5] 列印行列都為True的元素組成的narray
# 結果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[ 0 11]
[[ 0 1 2 3 4]
[10 11 12 13 14]]
[[ 0 1]
[ 5 6]
[10 11]
[15 16]]
-------
[[False False False False False]
[False True True True True]
[ True True True True True]
[ True True True True True]]
[ 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
小結:ar[][]裡面隻能是數值,清單類似的形式。
ar[a, b] 其中的a,b可以是數值,清單類似的形式, 也可以是布爾類型的一維清單,也可以是a[k] k是二維的布爾型array
五、numpy的索引和切片
# 一次修改一個元素
ar = np.arange(10).reshape(2, 5)
ar[1][2] = 100
print(ar)
# 一次修改多個相鄰的元素
ar[:, 2:] = 0 # 不能是 ar[:][2:] = 0 這樣是錯誤的
print(ar)
# 結果:
[[ 0 1 2 3 4]
[ 5 6 100 8 9]]
[[0 1 0 0 0]
[5 6 0 0 0]]
小結:1.如果是索引某二維array的元素,或者顯示其中多行多列時用ar[][],其他情況盡量用ar[, ]
2.清單不能用ar[a;b] = 100的形式來修改多個元素的值, 而一維的array可以
六、numpy的随機數生成
1.normal()
# 生成一個标準正太分布的4*4樣本值
ar = np.random.normal(size=(4, 4)) # 必須是這樣,size和()都不能省 ---size是設定其形狀,一維的是size=4,二維的是元組size=(4, 4)
print(ar)
# 結果:
[[ 0.92682019 0.614566 -1.80085596 -0.57091276]
[-1.1043685 1.18126955 0.06992522 0.65164341]
[-1.17288536 0.16927536 0.25020451 0.71442432]
[-0.80502592 0.60329458 0.47879308 -0.76152008]]
2.rand()
# 一維随機數數組
ar = np.random.rand(4) # 随機生成4個[0, 1)的浮點數
print(ar)
# 二維随機數數組
ar = np.random.rand(2, 3) # 2行3列的随機數組,元素值[0, 1)的浮點數,等價于 np.random.rand(6).reshape(2, 3)
print(ar)
# 結果:
[0.07855698 0.45287721 0.29377833 0.4874729 ]
[[0.85758177 0.93625845 0.3834727 ]
[0.17223084 0.60032557 0.81499668]]
3.randn()
# numpy.random.randn(d0, d1, ..., dn):生成一個浮點數或N維浮點數組 —— 正态分布
ar = np.random.randn(2, 3) # 二維的正态分布
print(ar)
# 結果:
[[ 0.79419815 -0.87986761 -0.37048526]
[ 1.00269964 -1.59903582 -1.65729325]]
4.randint()
# numpy.random.randint(low, high=None, size=None, dtype='l'):生成一個整數或N維整數數組
# 若high不為None時,取[low,high)之間随機整數,否則取值[0,low)之間随機整數,且high必須大于low
# dtype參數:隻能是int類型
ar1 = np.random.randint(3, size=4)
print(ar1)
ar2 = np.random.randint(2, 10, size=(2, 3))
print(ar2)
# 結果:
[1 1 0 1]
[[2 9 4]
[3 2 7]]
小結:
1.正太分布有np.random.normal()和np.random.randn()兩種
2.對于參數size,如果是一維的,直接size=a 二維的用元組size=(a,b) 多元的類似
3.随機數的取值一般都是左閉右開 [a, b)
4.rand和randn參數沒有size,直接用 np.random.rand(a, b)
七、numpy的資料存儲
1.npy檔案
# 1---.npy檔案
import os
os.chdir('D:/') # 檔案夾路徑
ar = np.random.rand(4, 4)
print(ar)
np.save('test.npy', ar) # 若檔案不存在,會自動建立,預設是覆寫寫入 wb
a = np.load('test.npy')
print(a)
# 結果:
[[0.92373925 0.32301451 0.51564998 0.80733927]
[0.89979651 0.8530066 0.0987105 0.80803988]
[0.79187015 0.02192928 0.89630674 0.05568327]
[0.3872979 0.74023464 0.60665628 0.29358984]]
[[0.92373925 0.32301451 0.51564998 0.80733927]
[0.89979651 0.8530066 0.0987105 0.80803988]
[0.79187015 0.02192928 0.89630674 0.05568327]
[0.3872979 0.74023464 0.60665628 0.29358984]]
2.txt檔案
import os
# 2---.txt檔案
ar = np.random.rand(2, 3)
np.savetxt('text.txt', ar, delimiter=',')
print(ar)
a = np.loadtxt('text.txt', delimiter=',')
print(a)
# 結果:
[[0.70941669 0.44031327 0.34353032]
[0.5805601 0.52475665 0.0504758 ]]
[[0.70941669 0.44031327 0.34353032]
[0.5805601 0.52475665 0.0504758 ]]