更新時(shí)間:2022年10月10日14時(shí)10分 來源:傳智教育 瀏覽次數(shù):
通過前面對NumPy的學(xué)習(xí),相信大家一定對NumPy這個(gè)科學(xué)計(jì)算包有了一定的了解,接下來,本節(jié)將通過酒鬼漫步的案例來介紹如何運(yùn)用NumPy隨機(jī)數(shù)模塊與數(shù)據(jù)處理。
下面先為大家描述一下場景,在一片空曠的平地上(一個(gè)二維地面上)有一個(gè)酒鬼,他最初停留在原點(diǎn)的位置,這個(gè)酒鬼每走一步時(shí),方向是不確定的,在經(jīng)過時(shí)間t之后,我們希望計(jì)算出這個(gè)酒鬼與原點(diǎn)的距離。
例如,這個(gè)酒鬼走了2000步(每步為0.5米),向前走一步記為1,向后走一步記為-1,當(dāng)計(jì)算距原點(diǎn)的距離時(shí),就是將所有的步數(shù)進(jìn)行累計(jì)求和。因此,使用random模塊來隨機(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ù)的絕對值,則需要調(diào)用abs()函數(shù)實(shí)現(xiàn),不過該函數(shù)返回的是一個(gè)布爾數(shù)組,即不滿足條件的值均為False,滿足條件的值均為True。為了從滿足條件的結(jié)果中返回最大值的索引,則還需要通過調(diào)用argmax()方法來實(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)的長度是大于或等于15米的。
北京校區(qū)