天天看點

資料分析---科學計算工具numpy(下)

文章目錄

    • 科學計算工具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 ]]