python輸入一個數組輸出24進制式的時間_4.4 用于數組的文件輸入輸出 線性代數...

Numpy能夠讀寫磁盤上的文本數據或二進制數據。這一小節只討論Numpy的內置二進制格式,因為更多的用戶會使用pandas或其它工具加載文本或表格數據(見第6章)。

np.save和np.load是讀寫磁盤數組數據的兩個主要函數。默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為.npy的文件中的:

In [213]: arr = np.arange(10)

In [214]: np.save('some_array', arr)

如果文件路徑末尾沒有擴展名.npy,則該擴展名會被自動加上。然后就可以通過np.load讀取磁盤上的數組:

In [215]: np.load('some_array.npy')

Out[215]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

通過np.savez可以將多個數組保存到一個未壓縮文件中,將數組以關鍵字參數的形式傳入即可:

In [216]: np.savez('array_archive.npz', a=arr, b=arr)

加載.npz文件時,你會得到一個類似字典的對象,該對象會對各個數組進行延遲加載:

In [217]: arch = np.load('array_archive.npz')

In [218]: arch['b']

Out[218]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如果要將數據壓縮,可以使用numpy.savez_compressed:

In [219]: np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

線性代數

線性代數(如矩陣乘法、矩陣分解、行列以及其他方陣數學等)是任何數組庫的重要組成部分。不像某些語言(如matlab),通過*對兩個二維數組相乘得到的是一個元素級的積,而不是一個矩陣點積。因此,Numpy提供了一個用于矩陣乘法的dot函數(既是一個數組方法也是numpy命名空間的一個函數):

In [223]: x = np.array([[1., 2., 3.], [4., 5., 6.]])

In [224]: y = np.array([[6., 23.], [-1, 7], [8, 9]])

In [225]: x

Out[225]:

array([[ 1., 2., 3.],

[ 4., 5., 6.]])

In [226]: y

Out[226]:

array([[ 6., 23.],

[ -1., 7.],

[ 8., 9.]])

In [227]: x.dot(y)

Out[227]:

array([[ 28., 64.],

[ 67., 181.]])

x.dot(y)等價于np.dot(x, y)

In [228]: np.dot(x, y)

Out[228]:

array([[ 28., 64.],

[ 67., 181.]])

一個二維數組跟一個大小合適的一維數組的矩陣點積運算之后將會得到一個一維數組:

In [229]: np.dot(x, np.ones(3))

Out[229]: array([ 6., 15.])

@符也可以用來用作運算符,進行矩陣乘法:

In [230]: x @ np.ones(3)

Out[230]: array([ 6., 15.])

numpy.linalg中有一組標準的矩陣分解運算以及諸如求逆和行列式之類的東西。它們跟matlab和R等語言所使用的是相同的行業標準線性代數庫,如BLAS、LAPACK、Intel MKL(Math Kernel Library,可能有,取決于你的NumPy版本)等:

In [231]: from numpy.linalg import inv, qr

In [232]: X = np.random.randn(5, 5)

In [233]: mat = X.T.dot(X)

In [234]: inv(mat)

Out[234]:

array([[ 933.1189, 871.8258, -1417.6902, -1460.4005, 1782.1391],

[ 871.8258, 815.3929, -1325.9965, -1365.9242, 1666.9347],

[-1417.6902, -1325.9965, 2158.4424, 2222.0191, -2711.6822],

[-1460.4005, -1365.9242, 2222.0191, 2289.0575, -2793.422 ],

[ 1782.1391, 1666.9347, -2711.6822, -2793.422 , 3409.5128]])

In [235]: mat.dot(inv(mat))

Out[235]:

array([[ 1., 0., -0., -0., -0.],

[-0., 1., 0., 0., 0.],

[ 0., 0., 1., 0., 0.],

[-0., 0., 0., 1., -0.],

[-0., 0., 0., 0., 1.]])

In [236]: q, r = qr(mat)

In [237]: r

Out[237]:

array([[-1.6914, 4.38 , 0.1757, 0.4075, -0.7838],

[ 0. , -2.6436, 0.1939, -3.072 , -1.0702],

[ 0. , 0. , -0.8138, 1.5414, 0.6155],

[ 0. , 0. , 0. , -2.6445, -2.1669],

[ 0. , 0. , 0. , 0. , 0.0002]])

表達式X.T.dot(X)計算X和它的轉置X.T的點積。

表4-7列出了一些最常用的線性代數函數:

偽隨機數生成

numpy.random模塊對Python內置的random進行了補充,增加了一些用于高效生成多種概率分布的樣本值的函數。例如,你可以用normal來得到一個標準正態分布的4×4樣本數組:

In [238]: samples = np.random.normal(size=(4, 4))

In [239]: samples

Out[239]:

array([[ 0.5732, 0.1933, 0.4429, 1.2796],

[ 0.575 , 0.4339, -0.7658, -1.237 ],

[-0.5367, 1.8545, -0.92 , -0.1082],

[ 0.1525, 0.9435, -1.0953, -0.144 ]])

而Python內置的random模塊則只能一次生成一個樣本值。從下面的測試結果可以看出,如果需要產生大量樣本值,numpy.random快了不止一個數量級:

In [240]: from random import normalvariate

In [241]: N = 1000000

In [242]: %timeit samples = [normalvariate(0, 1) for _ in range(N)]

1.77 s +- 126 ms per loop (mean +- std. dev. of 7 runs, 1 loop each)

In [243]: %timeit np.random.normal(size=N)

61.7 ms +- 1.32 ms per loop (mean +- std. dev. of 7 runs, 10 loops each)

我們說這些都是偽隨機數,是因為它們都是通過算法基于隨機數生成器種子,在確定性的條件下生成的。你可以用Numpy的np.random.seed更改隨機數生成種子:

In [244]: np.random.seed(1234)

numpy.random的數據生成函數使用了全局的隨機種子。要避免全局狀態,你可以使用numpy.random.RandomState,創建一個與其它隔離的隨機數生成器:

In [245]: rng = np.random.RandomState(1234)

In [246]: rng.randn(10)

Out[246]:

array([ 0.4714, -1.191 , 1.4327, -0.3127, -0.7206, 0.8872, 0.8596,

-0.6365, 0.0157, -2.2427])

表4-8列出了numpy.random中的部分函數。在下一節中,我將給出一些利用這些函數一次性生成大量樣本值的范例。

示例:隨機漫步

我們通過模擬隨機漫步來說明如何運用數組運算,先來看一個簡單的隨機漫步的例子:從0開始,步長1和-1出現的概率相等。

下面是一個通過內置的random模塊以純Python的方式實現1000步的隨機漫步:

In [247]: import random

.....: position = 0

.....: walk = [position]

.....: steps = 1000

.....: for i in range(steps):

.....: step = 1 if random.randint(0, 1) else -1

.....: position += step

.....: walk.append(position)

.....:

圖4-4是根據前100個隨機漫步值生成的折線圖:

In [249]: plt.plot(walk[:100])

圖4-4 簡單的隨機漫步.png

不難看出,這其實就是隨機漫步中各步的累計和,可以用一個數組運算來實現。因此,我用np.random模塊一次性隨機產生1000個“擲硬幣”結果(即兩個數中任選一個),將其分別設置成1或-1,然后計算累計和:

In [251]: nsteps = 1000

In [252]: draws = np.random.randint(0, 2, size=nsteps)

In [253]: steps = np.where(draws > 0, 1, -1)

In [254]: walk = steps.cumsum()

有了這些數據之后,我們就可以沿著漫步路徑做一些統計工作了,比如求取最大值和最小值:

In [255]: walk.min()

Out[255]: -3

In [256]: walk.max()

Out[256]: 31

現在來看一個復雜點的統計任務——首次穿越時間,即隨機漫步過程中第一次到達某個特定值的時間。假設我們想要知道本次隨機漫步需要多久才能舉例初始0點至少10步遠(任一方向均可)。np.abs(walk)>=10可以得到一個布爾型數組,它表示的是距離是否達到或超過10,而我們想要知道的是第一個10或-10的索引。可以用argmax來解決這個問題,它返回的是該布爾型數組第一個最大值的索引(True就是最大值):

In [257]: (np.abs(walk) >= 10).argmax()

Out[257]: 37

注意,這里使用argmax并不是很高效,因為它無論如何都會對數組進行完全掃描。在本例中,只要發現了一個True,那我們就知道它是個最大值了。

一次模擬多個隨機漫步

如果你希望模擬多個隨機漫步過程(比如5000個),只需對上面的代碼做一點點修改即可生成所有的隨機漫步過程。只要給numpy.random的函數傳入一個二元元組就可以產生一個二維數組,然后我們就可以一次性計算5000個隨機漫步過程(一行一個)的累計和了:

In [258]: nwalks = 5000

In [259]: nsteps = 1000

In [260]: draws = np.random.randint(0, 2, size=(nwalks, nsteps)) # 0 or 1

In [261]: steps = np.where(draws > 0, 1, -1)

In [262]: walks = steps.cumsum(1)

In [263]: walks

Out[263]:

array([[ 1, 0, 1, ..., 8, 7, 8],

[ 1, 0, -1, ..., 34, 33, 32],

[ 1, 0, -1, ..., 4, 5, 4],

...,

[ 1, 2, 1, ..., 24, 25, 26],

[ 1, 2, 3, ..., 14, 13, 14],

[ -1, -2, -3, ..., -24, -23, -22]])

現在,我們來計算所有隨機漫步過程的最大值和最小值:

In [264]: walks.max()

Out[264]: 138

In [265]: walks.min()

Out[265]: -133

得到這些數據之后,我們來計算30或-30的最小穿越時間。這里稍微復雜些,因為不是5000個過程都到達了30。我們可以用any方法來對此進行檢查:

In [266]: hits30 = (np.abs(walks) >= 30).any(1)

In [267]: hits30

Out[267]: array([False, True, False, ..., False, True, False], dtype=bool)

In [268]: hits30.sum() # Number that hit 30 or -30

Out[268]: 3410

然后我們利用這個布爾型數組選出那些穿越了30(絕對值)的隨機漫步(行),并調用argmax在軸1上獲取穿越時間:

In [269]: crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)

In [270]: crossing_times.mean()

Out[270]: 498.88973607038122

請嘗試用其他分布方式得到漫步數據。只需使用不同的隨機數生成函數即可,如normal用于生成指定均值和標準差的正態分布數據:

In [271]: steps = np.random.normal(loc=0, scale=0.25,

.....: size=(nwalks, nsteps))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/369974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/369974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/369974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DBMS-數據庫設計與E-R模型:E-R模型、約束、E-R圖、E-R擴展特性、E-R圖轉換為關系模式、UML建模...

設計過程概覽 1. 設計階段 最初階段:刻畫未來數據庫用戶的數據需求,產品為用戶需求規格說明; 概念設計階段(conceptual-design phase):(關注描述抽象數據及其聯系,通常使用實體-聯系…

tooltip.css-2.0文檔

tooltip.css 純CSS鼠標提示工具。 v. 2.0.0 更新日期&#xff1a;2018.4.12 預覽DEMO。 安裝&#xff1a; 只需在頁面中引入"tooltip.css"或“tooltip.min.css”文件即可。 如&#xff1a; <link rel"stylesheet" href"css/tooltip.css"…

Java虛擬機:如何判定哪些對象可回收?

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請注明出處&#xff0c;歡迎交流學習&#xff01; 在堆內存中存放著Java程序中幾乎所有的對象實例&#xff0c;堆內存的容量是有限的&#xff0c;Java虛擬機會對堆內存進行管理&#xff0c;回收已經“死去”的對象&…

html標簽object和embed,html標簽object和embed的區別

object和embed的區別The code in bold above is the actual code that you need to place in your page to embed a FusionCharts chart.In the above code, weveused and tags to embed the 3D Column Chart (Column3D.swf) within the HTML page.used &dataUrlData.xml u…

Apache Apollo REST API

Apache Apollo是新一代&#xff0c;高性能&#xff0c;多協議的消息傳遞代理&#xff0c;它是從頭開始構建的&#xff0c;可以替代ActiveMQ5.x。 我過去曾在博客上發表過文章 &#xff08;第一部分已經與第二部分一起發布了&#xff09;。 Apollo的非阻塞異步體系結構使其速度…

bzoj1588 [HNOI2002]營業額統計

1588: [HNOI2002]營業額統計 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17931 Solved: 7391[Submit][Status][Discuss]Description 營業額統計 Tiger最近被公司升任為營業部經理&#xff0c;他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 T…

python管道通信_Python進程通信之匿名管道實例講解

匿名管道管道是一個單向通道,有點類似共享內存緩存.管道有兩端,包括輸入端和輸出端.對于一個進程的而言,它只能看到管道一端,即要么是輸入端要么是輸出端.os.pipe()返回2個文件描述符(r, w),表示可讀的和可寫的.示例代碼如下:復制代碼 代碼如下:#!/usr/bin/pythonimport timeim…

css3中的box-sizing屬性的使用

box-sizing屬性用來定義元素的width和height所表示的區域,該屬性一般有三種值&#xff1a;content-box、border-box、inherit。 其中inherit表示box-sizing的值應該從父元素繼承。 content-box和border-box的主要區別就是元素的width和height的值包不包括border、padding這兩…

ES6擴展運算符...進行的數組刪除

今天寫了按照React小書寫了Reducer&#xff0c;發現基礎真是太重要了&#xff0c;所有關于上層建筑的細節都需要回到下層細節中去尋找&#xff0c;而且現在的基礎也由ES3變成了ES6了。 const ADD_USER "ADD_USER" const DELETE_USER "DELETE_USER" const…

中南大學在線考試答案計算機基礎,中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc...

中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc 計算機基礎01 總共89題共100分 一. 單選題 (共35題,共35分) 1. 域名服務器DNS的主要功能是( )。 (1分) A.通過請求及回答獲取主機和網絡相關的信息 B.查詢主機的MAC地址 C.為主機自動命名 D.合理分配IP地址 ★標準答案&…

自動化的OSGi測試運行器

在我的團隊成員中&#xff0c;我以忘記維護&#xff08;JUnit&#xff09;測試套件而聞名。 我只是無法為此付出額外的手動為套件添加測試的步驟。 幸運的是&#xff0c;有連續的集成服務器通過命名模式收集測試。 如果我介紹的一項孤立測試失敗了&#xff0c;那么它會脫穎而出…

php post請求后端拿不到值_PHP Post獲取不到非表單數據的問題解決辦法

問題描述在使用vue-axios向后端post數據時&#xff0c;PHP端獲取不到post的數據。問題解決修改php.ini配置找到php.ini配置文件&#xff0c;查找enable_post_data_reading變量&#xff0c;修改為打開狀態&#xff0c;注釋掉句前分好; Whether PHP will read the POST data.; Th…

CSS制作簡單loading動畫

曾經以為&#xff0c;loading的制作需要一些比較高深的web動畫技術&#xff0c;后來發現大多數loading都可以用“障眼法”做出來。比如一個旋轉的圓圈&#xff0c;并不都是將gif圖放進去&#xff0c;有些就是畫個靜止圖像&#xff0c;然后讓它旋轉就完了。gif圖也可以&#xff…

機器學習:多變量線性回歸

************************************** 注&#xff1a;本系列博客是博主學習Stanford大學 Andrew Ng 教授的《機器學習》課程筆記。博主深感學過課程后&#xff0c;不進行總結非常easy遺忘&#xff0c;依據課程加上自己對不明確問題的補充遂有此系列博客。本系列博客包含線性…

Java對象復活

總覽 收集覆蓋了finalize&#xff08;&#xff09;的對象之后&#xff0c;將其添加到終結處理隊列中&#xff0c;以在調用每個對象的finalize&#xff08;&#xff09;方法之后進行清理。 如果您復活該物體&#xff0c;會發生什么&#xff1f; 何時定稿&#xff1f; finalize方…

經過路由無法找到計算機,電腦無法啟動服務提示系統找不到指定的路徑(圖)

原標題&#xff1a;"電腦無法啟動服務提示系統找不到指定的路徑"相關電腦問題教程分享。 - 來源:191路由網。眾所周知&#xff0c;使用電腦的時候需要啟動一些服務才能使用相關的功能&#xff0c;但是如果出現無法啟動服務項&#xff0c;并且提示“錯誤3&#xff1a;…

有關域索引錯誤產生的原因及解決辦法

1說明 數據庫錯誤ORA-29861:域索引標記為LOADING/FAILED/UNUSABLE&#xff0c;其錯誤原因及解決辦法&#xff0c;根據ORACLE官方文檔的說法如下&#xff1a; // *Cause: An attempt has been made to access a domain index that is// being built or is marked faile…

詳細解讀css中的浮動以及清除浮動的方法

對于前端初學者來說&#xff0c;css浮動部分的知識是一塊比較難以理解的部分&#xff0c;下面我將把我學習過程中的心得分享給大家。 導讀&#xff1a; 1.css塊級元素講解 2.css中浮動是如何產生的 3.出現浮動后&#xff0c;如何清除浮動&#xff08;本文將涉及到多種清除浮動…

微信多開txt_電腦版微信怎么雙開、多開

新建一個txt文本文件&#xff0c;在文件中寫入如下代碼&#xff1a;echo offstart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exestart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exeexit保存文本文件。這里需要注意的是&#xff1a…

java 基礎--隨筆

---恢復內容開始--- java 對大小寫敏感。 java沒有任何無符號類型&#xff08;unsigned&#xff09;。 C/C是編譯型語言&#xff0c;java是解釋性語言。 JAVA編譯過程同C/C 的 編譯有些不同。當C編譯器編譯生成一個對象的代碼時&#xff0c;該代碼是為在某一特定硬件平臺運行而…