本章節主要介紹NumPy中的三個主要的函數,分別是隨機函數、統計函數和梯度函數,以及一個較經典的用數組來表示圖像的栗子!,但願你們能有新的收貨,共同進步!python
舉個栗子:數組
使用rand函數隨機生成3*4*5維的數組:dom
import numpy as np a = np.random.rand(3, 4, 5) print(a)
[[[0.19286829 0.43532618 0.76943415 0.70048451 0.57059645] [0.2879177 0.09881033 0.5569482 0.66148796 0.79611884] [0.31448432 0.83716575 0.41643824 0.86719307 0.03466441] [0.32409171 0.68495018 0.92662221 0.02462274 0.43318601]] [[0.03772647 0.86047162 0.22297318 0.25169961 0.04855723] [0.19216536 0.34209728 0.41324992 0.17463538 0.23026854] [0.31120323 0.34793805 0.6097682 0.26008646 0.75306371] [0.60755713 0.28799642 0.60235958 0.69418041 0.04996581]] [[0.68136971 0.27706275 0.70780751 0.49022203 0.1700511 ] [0.17666416 0.55479535 0.18881965 0.24248033 0.58432088] [0.03958541 0.34799081 0.62522536 0.66729503 0.94124187] [0.98251218 0.38442045 0.9647026 0.09981866 0.07480372]]]
使用randn函數隨機生成3*4*5維的數組:函數
import numpy as np sn = np.random.randn(3, 4, 5) print(sn)
生成的數組符合標準正態分佈:ui
[[[-0.97546248 0.46482237 0.46232481 -0.81607844 0.02227037] [ 1.41672647 0.3036927 -0.46643274 0.46203588 1.19725522] [-1.00459345 -1.51265022 -1.10989086 -1.73492446 0.7985382 ] [-0.55015804 1.75202698 0.34619959 2.10673056 1.1267265 ]] [[-0.52607436 -1.11950328 0.00868366 1.78641448 -1.2655594 ] [ 2.17963077 0.13667921 2.35539206 -0.23587487 0.89031534] [-0.03255321 -0.80851392 0.1731047 -2.35959613 -0.09527181] [-0.5231855 -0.41071298 -0.24792927 0.58756083 -0.01207484]] [[ 0.82598316 0.16728761 0.73248991 -1.03238179 -0.91388066] [ 0.53091162 0.50406905 -1.54711219 -0.44278951 -1.08371051] [ 0.95577053 0.8806842 -0.48579249 -0.07832728 -0.23302233] [ 2.38093125 -0.93528845 -0.50766876 0.81836112 -1.77913608]]]
使用seed()函數和randint()函數隨機生成數組:spa
np.random.seed(10) b = np.random.randint(100, 200, (3, 4)) print(b)
隨機生成的數在(100,200)區間範圍內:code
[[109 115 164 128] [189 193 129 108] [173 100 140 136]]
再次使用seed(10),給予一樣的種子,咱們能夠發現產生的隨機數是相同的:orm
import numpy as np np.random.seed(10) b = np.random.randint(100, 200, (3, 4)) print(b) np.random.seed(10) print(np.random.randint(100, 200, (3, 4)))
生成的結果如出一轍以下:blog
[[109 115 164 128] [189 193 129 108] [173 100 140 136]] [[109 115 164 128] [189 193 129 108] [173 100 140 136]]
舉個栗子:事件
首先生成隨機函數,再使用shuffle函數來改變形狀:
import numpy as np a = np.random.randint(100, 200, (3, 4)) print(a) np.random.shuffle(a) print(a)
可使用shuffle函數後a數組發現了變化:
[[165 136 138 198] [185 182 199 130] [123 188 114 119]] [[123 188 114 119] [165 136 138 198] [185 182 199 130]]
再使用choice函數來舉個栗子:
b = np.random.randint(100, 200, (8,)) print(b) print(np.random.choice(b, (3, 2))) print(np.random.choice(b, (3, 2), replace=False)) print(np.random.choice(b, (3, 2), p=b / np.sum(b)))
函數生成的結果以下:
[152 142 143 125 195 140 109 181] [[140 109] [152 125] [109 140]] [[195 152] [109 125] [142 181]] [[152 143] [143 140] [142 142]]
舉個栗子:
產生均勻分佈的數組:起始值爲0,結束值爲10
u = np.random.uniform(0, 10, (3, 4)) print(u)
[[4.9326288 7.34687698 4.97977426 7.99871934] [5.00649544 5.07442334 7.18781348 7.32208848] [3.34763035 0.07099091 5.13151326 3.18421811]]
產生正態分佈的數組,均值爲10,標準差爲5的數組:
n = np.random.normal(10, 5, (3, 4)) print(n)
[[ 6.8513438 11.24016929 10.4074887 16.40272973] [14.08424738 0.18636224 6.92151938 12.04935454] [16.29518527 -0.90952865 -2.54181221 20.08502763]]
舉個栗子:
求和:
import numpy as np a = np.arange(15).reshape((3, 5)) print(np.sum(a))
結果:
105
1軸求指望:
print(np.mean(a, axis=1)) [ 2. 7. 12.]
0軸求指望:
print(np.mean(a, axis=0)) [5. 6. 7. 8. 9.]
0軸求加權平均值:
print(np.average(a, axis=0, weights=[10, 5, 1])) [2.1875 3.1875 4.1875 5.1875 6.1875]
求標準差:
print(np.std(a)) 4.320493798938574
求方差:
print(np.var(a)) 18.666666666666668
舉個栗子:
生成基礎數組:
b = np.arange(15, 0, -1).reshape(3, 5)
數組中最大值:
print(np.max(b))
數組降一維後最大值對於下標:
print(np.argmax(b))
根據shape將一維下標index轉換成多維下標:
print(np.unravel_index(np.argmax(b), b.shape))
求最大值和最小值之差:
print(np.ptp(b))
求數組中的中位數:
print(np.median(b))
在NumPy中的梯度函數是np.gradient(f),該函數能計算數組f中元素的梯度,當f爲多維時,返回每一個維度的梯度。
所謂的梯度指的是連續值之間的變化率,即斜率。
舉個栗子:
一維數組:
生成數組:
import numpy as np a = np.random.randint(0, 20, (5))
求該數組的梯度:
print(np.gradient(a))
結果是:
[ 2. 0. 4. 3.5 -3. ]
二維數組:
生成數組:
c = np.random.randint(0, 50, (3, 5))
求該數組的梯度:
print(np.gradient(c))
結果是:
[array([[ -9., 4., 7., 0., -42.], [ -5., 2., -7., 11., -22.], [ -1., 0., -21., 22., -2.]]), array([[-22. , -1. , -4.5, 9. , 47. ], [ -9. , 7. , -6.5, -15.5, 5. ], [ -8. , -3. , 4.5, -6. , -19. ]])]
咱們能夠把現有的圖像繪製成手繪的效果:
原始圖是:
from PIL import Image import numpy as np a = np.asarray(Image.open('beijing.jpg').convert('L')).astype('float') depth = 10. # (0-100) grad = np.gradient(a) # 取圖像灰度的梯度值 grad_x, grad_y = grad # 分別取橫縱圖像梯度值 grad_x = grad_x*depth/100. grad_y = grad_y*depth/100. A = np.sqrt(grad_x**2 + grad_y**2 + 1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A vec_el = np.pi/2.2 # 光源的俯視角度,弧度值 vec_az = np.pi/4. # 光源的方位角度,弧度值 dx = np.cos(vec_el)*np.cos(vec_az) # 光源對x 軸的影響 dy = np.cos(vec_el)*np.sin(vec_az) # 光源對y 軸的影響 dz = np.sin(vec_el) # 光源對z 軸的影響 b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) # 光源歸一化 b = b.clip(0, 255) im = Image.fromarray(b.astype('uint8')) # 重構圖像 im.save('beijing4.jpg')
最終 生成的圖形效果是:
本章節的內容就分享到此,但願能幫助你們對於NumPy庫有個深入的入門!