(四)初識NumPy(函數和圖像的數組表示)

本章節主要介紹NumPy中的三個主要的函數,分別是隨機函數、統計函數和梯度函數,以及一個較經典的用數組來表示圖像的栗子!,但願你們能有新的收貨,共同進步!python

1、np.random的隨機函數(1)

  1. rand(d0,d1...,dn)              根據d0-dn建立隨機數數組,浮點數,[0,1)均勻分佈;
  2. randn(d0,d1...,dn)               根據d0-dn建立隨機數數組,符合標準正態分佈;
  3. randint(low[,high,shape)             根據shape建立隨機整數或整數數組,範圍是[low,high);
  4. seed(s)                   隨機數種子,s是給定的種子值。

舉個栗子:數組

使用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]]

 2、np.randon的隨機函數(2)

  1. shuffle(a)            根據數組a的第一軸進行隨機排列,改變數組a;
  2. permutation(a)            根據數組a的第一軸產生一個新的亂序數組,不改變數組a;
  3. choice(a[,size,replace,p])      從一維數組a中以機率p抽取元素,造成size形狀數組,replace表示是否能夠重用元素,默認爲False.

舉個栗子:事件

首先生成隨機函數,再使用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]]

 3、np.random的隨機函數(3)

  1. uniform(low,high,size)            產生具備均勻分佈的數組,low起始值,high結束值,size形狀;
  2. normal(loc,scale,size)            產生具備正態分佈的數組,loc均值,scale標準差,size形狀;
  3. poisson(lam,size)              產生具備泊松分佈的數組,lam隨機事件發生率,size形狀。

舉個栗子:

產生均勻分佈的數組:起始值爲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]]

 4、NumPy的統計函數(基本函數)

  1. sum(a, axis=None)                                                   根據給定軸axis計算數組a相關元素以後,axis爲整數或元組;
  2. mean(a, axis=None)                                              根據給定軸axis計算數組a相關元素的指望,axis爲整數或元組;
  3. average(a,axis=None,weights=None)                           根據給定軸axis計算數組a相關元素的加權平均值;
  4. std(a,axis=None)                                                           根據給定軸axis計算數組a相關元素的標準差;
  5. var(a,axis=None)                                                           根據給定軸axis計算數組a相關元素的方差;

舉個栗子:

求和:

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

 5、NumPy的統計函數(升級)

  1. min(a)  max(a)                                                                     計算數組a中元素的最小值、最大值;
  2. unravel_index(index,shape)                                                                        根據shape將一維下標index轉換成多維下標;
  3. ptp(a)                                                                                                           計算數組a中元素最大值與最小值的差;
  4. median()                                                                                                 計算數組a中元素的中位數(中值);
  5. argmin(a)  argmax(a)                                                                                  計算數組a中元素最小值、最大值的降一維後的下標。

舉個栗子:

生成基礎數組:

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))

 6、NumPy的梯度函數

在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. ]])]

 7、圖像的數組表示:

咱們能夠把現有的圖像繪製成手繪的效果:

原始圖是:

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庫有個深入的入門!

相關文章
相關標籤/搜索