教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

科學(xué)計(jì)算庫(kù)NumPy案例:酒鬼漫步

更新時(shí)間:2022年10月10日14時(shí)10分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  通過(guò)前面對(duì)NumPy的學(xué)習(xí),相信大家一定對(duì)NumPy這個(gè)科學(xué)計(jì)算包有了一定的了解,接下來(lái),本節(jié)將通過(guò)酒鬼漫步的案例來(lái)介紹如何運(yùn)用NumPy隨機(jī)數(shù)模塊與數(shù)據(jù)處理。

  下面先為大家描述一下場(chǎng)景,在一片空曠的平地上(一個(gè)二維地面上)有一個(gè)酒鬼,他最初停留在原點(diǎn)的位置,這個(gè)酒鬼每走一步時(shí),方向是不確定的,在經(jīng)過(guò)時(shí)間t之后,我們希望計(jì)算出這個(gè)酒鬼與原點(diǎn)的距離。

  例如,這個(gè)酒鬼走了2000步(每步為0.5米),向前走一步記為1,向后走一步記為-1,當(dāng)計(jì)算距原點(diǎn)的距離時(shí),就是將所有的步數(shù)進(jìn)行累計(jì)求和。因此,使用random模塊來(lái)隨機(jī)生成2000個(gè)“擲硬幣值”(兩個(gè)結(jié)果任選一個(gè)),具體代碼如下:

導(dǎo)入numpy包
import numpy as np
steps=2000
draws=np.random.randint(0, 2, size=steps)
# 當(dāng)元素為1時(shí),direction_steps為1,
# 當(dāng)元素為0時(shí),direction_steps為-1
direction_steps=np.where(draws>0, 1, -1)
# 使用cumsum()計(jì)算步數(shù)累計(jì)和
distance=direction_steps.cumsum()

  有了步數(shù)的累計(jì)和之后,可以嘗試計(jì)算酒鬼距離原點(diǎn)最遠(yuǎn)的距離,即分別調(diào)用max()與min()計(jì)算向前走與向后走的最大值,具體代碼如下。

In [141]: # 使用max()計(jì)算向前走的最遠(yuǎn)距離
          distance.max()
Out[141]: 12
In [142]: # 使用min()計(jì)算向后走的最遠(yuǎn)距離
          distance.min()
Out[142]: -31

  從兩次輸出的結(jié)果中可以看出,這個(gè)酒鬼走的最遠(yuǎn)的距離是朝后方距離原點(diǎn)15.5(31×0.5)米的位置。值得一提的是,由于這里使用的是隨機(jī)數(shù),所以每次運(yùn)行的結(jié)果是隨機(jī)的。

  當(dāng)酒鬼距原點(diǎn)的距離大于或等于15米時(shí),如果希望計(jì)算他總共走了多少步,則可以使用數(shù)學(xué)方程“|x×0.5|≥15”完成,其中x表示步數(shù)。要想計(jì)算一個(gè)數(shù)的絕對(duì)值,則需要調(diào)用abs()函數(shù)實(shí)現(xiàn),不過(guò)該函數(shù)返回的是一個(gè)布爾數(shù)組,即不滿足條件的值均為False,滿足條件的值均為T(mén)rue。為了從滿足條件的結(jié)果中返回最大值的索引,則還需要通過(guò)調(diào)用argmax()方法來(lái)實(shí)現(xiàn),具體代碼如下。

In [143]: # 15米換算成步數(shù)
          steps=15/0.5
          (np.abs(distance)>=steps).argmax()
Out[143]: 877

  從計(jì)算結(jié)果可以看出,當(dāng)酒鬼走到877步時(shí),此時(shí)距離原點(diǎn)的長(zhǎng)度是大于或等于15米的。

0 分享到:
和我們?cè)诰€交談!