當前位置:
首頁 > 最新 > ndarray的生成、屬性、索引

ndarray的生成、屬性、索引

小夥伴們又見面啦!上一次我們已經知道,ndarray是numpy庫里的一組多維數組對象,用來存放多維數組。那麼,問題來了,因為python中本來就有List即:列表,可以用來存放數組,可是為什麼還是要引入numpy中的ndarray呢?我認為其中有兩個原因:1.由於列表的元素可以是任意的對象,所以列表保存的是對象的指針,比如說為了保存列表[1,2,3],需要保存三個指針和三個整數對象,這勢必會導致浪費內存和CPU的時間。2.numpy會為ndarray提供配套的一整套標準的數學函數進行統計、運算,而不用編寫循環,相對於列表來說也更節省資源和時間。首先進入我們的集成開發環境:ipython notebook(在命令行直接輸入ipython notebook即可)

一.ndarray的產生

輸入import numpy as np這樣一個通式,將numpy庫導入到環境中來。我們要做的是產生一個ndarray,先用一種簡單的方式來產生ndarray

可以看到,我們通過這種方法產生了一個numpy數組array([6,7,3,8]),可以看到,該數組是一個一維數組,因為我們傳入np.array中的數組就是一個一維數組[6,7,3,8]。我們還可以用這種方式往np.array中傳入一個二維數組來構建一個二維的numpy數組,如下

往np.array中傳入的是一個二維數組[[1,2,3,4],[5,6,7,8]],也就產生了所對應的二維numpy數組。

這個時候小夥伴們肯定會想:哎媽呀,每一個元素都需要我們高抬貴手來挨個輸入嗎?好累啊,哈哈,當然不用,這個大夥不用操心,numpy君已經為大家考慮過了,numpy中有自帶的數組創建函數,我們重點來看看以下幾個數組創建函數:

1.np.ones(shape)

咦?這是什麼意思,ones?莫不是。。。。太污啦,哈哈哈,嚴肅點:此ones非彼ones,我來給大家解答以下這個表達式的功能,咳咳,其功能就是,產生一個制定大小(shape)數組元素全為1的數組,shape呢,顧名思義,說通俗一點就是數組的形狀,比如說3行4列,那麼shape就是(3,4),廢話少說,咱們運行一次:

各位看官,瞧見了嗎,這就產生了一個三行四列的所有元素都為1的數組。

2.np.zeros(shape)

以此類推,這個表達式就是為了產生一個指定shape的元素全為0的數組。

3.np.eye(n)

這個表達式的意思是產生一個對角元素全為1,其餘元素全為0的,n行n列的數組。如下所示。

4.np.linspace(start,stop,num)

linspace函數生成的數組元素成等差數列排列,重點介紹三個參數:start、stop、num,start表示該數組元素的起始值,stop表示該數組元素的終值,num表示該數組所包含元素的個數。請注意:默認情況下數組中包含最後終值,即:stop。示例如下:

5.np.full(shape,val)

這個理解起來應該很簡單了吧,就算英語沒過四級應該也沒有問題,full函數所產生的數組的每一個元素都是val,且形狀,即幾行幾列都是由第一個參數「shape」來決定。

當然了,就像我們上次提到的,咱們最熟知的方法當然還是通過arange來產生一個一維數組,再通過reshape來進行形狀的重塑。如下:

二.ndarray的屬性

是的,通過上一部分的介紹,我們已經知道通過各種方法產生了數組,那麼這些數組又有怎樣的屬性呢,就好比數組是一個人,這個人有怎樣的性格、特性呢,我們就用屬性來進行描述吧,重點介紹以下幾個屬性:

ndim:用於返回數組的維數,你到底是一維還是二維,就靠它來查看,以前述的數組b為例:

可見,通過查看,數組b的維數是2。

size:用於返回數組元素的個數。這個很好理解。

itemsize:用於返回數組中每個元素所佔的位元組數。還是以數組b為例:

由此可見,數組b的每一個元素所佔4個位元組。

dtype:用於返回數組中每一個元素的類型。ndarray中各個數據類型,在後面的內容中會介紹到;

好啦,數組所擁有的屬性就介紹到這裡,接下來我們要進入數組的一個核心的內容就是ndarray的索引和切片。

三、索引和切片

這是numpy數組重要的性質,用於選取目標元素和數據片段。

先來介紹元素索引:咱們先從一維ndarray數組開始介紹吧,先用a = np.arange(10),來產生一個一維數組array([0,1,2,3,4,5,6,7,8,9]),上次我們已經提到,默認情況下,所有數組的下標都是從0開始的,因此,該數組中0的下標就是0,並依此往後推,如果我們要選取某一個元素的話,直接用下標就能找到他啦,比如說我們要選擇元素5的話,使用a[5]就能得到5。

同理,對於二維數組來說,因為他有兩個方向,因此,要選取其中某一個元素的話,需要兩個下標來定位。

如上例所示,要取出二維數組arr2d中的第3行第2列的元素:8,採用圖示的兩種方式獲取,換言之這兩種獲取二維數組元素的方式是等價的,可要記住喲,嘿嘿。

接下來我們來說說重頭戲——切片索引吧,還是分為一維數組和二維數組來進行介紹,老規矩,我將羅列出表達式搭配說明的方式來對各種切片索引的方式進行說明,這樣易懂而且印象深刻。從一維數組a開始,大家看好啦!

In:a[3:5] Out:array([3,4]) # 用這用的範圍作為下標可以獲取數組的一 個切片注意:包括a[3],而不包括a[5]

In:a[:-1] Out:array([0,1,2,3,4,5,6,7,8])

# 對於下標是負號這種情況,我的理解是:下標是負號,表示以最後一個元素為基準,往前偏移,負號後面的數字表示偏移的量,本例中冒號表示從第一個元素開始到下標為-1的位置,即是相比最後一個元素偏移量為1的位置,那就是7,所以得到了以上的結果。

In:a[2:4]=100,101 a Out:array([0,1,100,101,4,5,6,7,8,9])

# 特別注意,用切片索引選取的數據片段,是原有數據的視圖,通過切片為元素賦新值,其改變都會反映到原數據上,說通俗點:在選取的切片上對元素重新賦值,那麼原數組也會跟著改變。

In:a[1:-1:2] Out:array([0,2,4,6,8])

# 第三個參數表示的是取數據的步長,例子中的2表示每兩個數取一個。

一元數組的切片索引所需要的主要方式都在這裡啦,對於我們目前來說完全夠用,小夥伴們可以在自己的Ipython notebook上面,自己試試,下次咱們從二維數組的切片索引開始探討吧 ~


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

為了孩子,你應該知道的兒童房設計
王者榮耀:不改掉這些壞習慣,就別怪自己排位連輸!
名仕美甲貼怎麼代理,要代理費嗎
名仕美甲貼防不防水,質量好不好
DIY手工製作-元旦小吊飾

TAG:全球大搜羅 |