“五色令人目盲燥翅,五音令人耳聾蜕提,五味令人口爽,馳騁畋獵令人心發(fā)狂凛膏,難得之貨令人行妨脏榆。
是以圣人為腹不為目,故去彼取此吁断∥肷”[1]
numpy
NumPy數組通常是由相同種類的元素組成的,既數組中的數據項的類型必須一致又兵。
通常先要引入numpy包:
import numpy as np
創(chuàng)建一個簡單的一維
數據:
arr1 = np.arange(5)
arr1
輸出:
dtype('int64')
以上數組的數據類型為int64,除了知道數據類型之外宙地,還要注意其形狀逆皮,這一點非常重要。
arr1
輸出:
array([0, 1, 2, 3, 4])
arr1.shape
輸出:
(5,)
如你所見粹胯,該向量有5個元素辰企,他們的值分別是從0到4,該數組的shape屬性是一個元組,存放的是數組在每一個維度的長度竹观。
創(chuàng)建多維
數據
數組大于一維以后潜索,我們習慣稱之為矩陣
,下面創(chuàng)建一個2行2列的矩陣:
metr = np.array([1,2],[3,4])
上面的矩陣是通過向array()函數傳遞一個由列表組成的列表得到的誊抛,接下來整陌,我們要逐個選擇矩陣的各個元素,代碼如下所示随夸。下標從0開始震放,如下取出第1行第1列、第2行第2列的元素:
metr[0][0]
metr[1][1]
輸出:
1
4
可見诈铛,選擇數組元素是一件非常簡單的事情墨礁,對于數組metr,只要通過metr[m,n]的形態(tài)妨退,就能訪問數組內的元素,其中m和n為數組元素的下標冠句。
一維數組的切片與索引
一維NumPy數組的切片操作與Python列表的切片一樣幸乒。下面先來定義包括0、1聚唐、2腔召,直到8的一個數組,然后通過指定下標2到5來選擇該數組的部分元素亲桦,這實際上就是提取數組中值為2到5的那些元素浊仆。
arr2 = np.arange(9)
arr2[2:6]
輸出:
array([2, 3, 4, 5])
可以用下標選擇元素,下標范圍從0到7抡柿,并且下標每次遞增2,如:
arr2[:7:2]
輸出:
array([0, 2, 4, 6])
恰如使用Python那樣备蚓,也可用負值下標來反轉數組:
arr2[::-1]
輸出:
array([8, 7, 6, 5, 4, 3, 2, 1, 0])
處理數組形態(tài)
常用的處理數組形態(tài)的方法闪檬,先記錄如下幾個:
- reshape()
- ravel()
- flatten()
- transpose()
- resize()
reshape()
將一個由0到11構成的一維數組购笆,改變?yōu)?行4列的二維數組:
arr3 = np.arange(12).reshape(3,4)
arr3
輸出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
ravel()
將多維數組變成一維數組
將上面的二維數據再改變?yōu)橐痪S數組:
arr3.ravel()
輸出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
flatten()
其功能與ravel()相同同欠。可是衫哥,flatten()返回的是真實的數組襟锐,需要分配新的內存空間;而ravel()函數返回的只是數組的視圖蚊荣。兩者的區(qū)別在于返回拷貝(copy)還是返回視圖(view),numpy.flatten()返回一份拷貝奢入,對拷貝所做的修改不會影響(reflects)原始矩陣媳叨,而numpy.ravel()返回的是視圖(view,也頗有幾分C/C++引用reference的意味)武福,會影響(reflects)原始矩陣痘番。
arr3.flatten()
輸出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
transpose()
轉置:在線性代數中,矩陣的轉置操作非常常見界睁。轉置是一種數據變換方法兵拢,對于二維表而言,轉置就意味著行變成列访惜,同時列變成行腻扇。
如:創(chuàng)建一個0-11數字組成的一維數組,先reshape為3行4列的數組:
arr4 = np.arange(12).reshape(3,4)
arr4
輸出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
然后對其進行轉置:
arr4.transpose()
輸出:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
resize()
調整大兄侠椤:函數resize()的作用類似于reshape()舶沿,但是會改變所作用的數組:
如:將arr4調整為2行6列的二維數組
arr4.resize(2,6)
arr4
輸出:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
堆疊數組
從深度看括荡,數組既可以橫向疊放,也可以豎向疊放畸冲。涉及許下幾個方法:
- vstack()
- dstack()
- hstack()
- column_stack()
- row_stack()
- concatenate()
先創(chuàng)建兩個數組a 和 b,均為3行3列的二維數據:
數組a
a = np.arange(9).reshape(3,3)
a
輸出a:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
數組b
b = a*2
b
輸出b:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
hstack()
水平疊加:先介紹水平疊加方式恕沫,即用元組確定ndarrays數組的形狀纱意,然后交由hstack()函數來碼放這些數組。
np.hstack((a,b))
輸出:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]])
將調用hstack時a和b的入參順序換一下再看看結果:
np.hstack((b,a))
輸出:
array([[ 0, 2, 4, 0, 1, 2],
[ 6, 8, 10, 3, 4, 5],
[12, 14, 16, 6, 7, 8]])
vstack()
垂直疊加:使用垂直疊加方法時迄委,先要構建一個元祖类少,然后將元祖交給vstack()函數來碼放數組。
np.vstack((a,b))
輸出:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
當參數axis置0時信轿,concatenate()函數也會得到相同的效果残吩。實際上,這是該參數的缺省值:
np.concatenate((a,b),axis=0)
輸出:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
dstack()
深度疊加:除此之外即彪,還有一種深度疊加方法活尊,這要用到dstack()函數和一個元組蛹锰。這種方法是沿著第三個坐標軸(縱向)的方向來疊加一摞數組。舉例來說铜犬,可以在一個圖像數據的二維數組上疊加另一幅圖像的數據翎苫。
np.dstack((a,b))
輸出:
array([[[ 0, 0],
[ 1, 2],
[ 2, 4]],
[[ 3, 6],
[ 4, 8],
[ 5, 10]],
[[ 6, 12],
[ 7, 14],
[ 8, 16]]])
拆分numpy數組
可以從縱向榨了,橫向和深度方向來拆分數組,相關函數有hsplit(),vsplit(),dsplit()和split()呐粘。我們即可以把數組分成相同的形狀的數組,也可以從規(guī)定的位置開始切取數組唆垃。
橫向拆分:對于一個3行3列數組痘儡,可以沿著橫軸方向將其分解為3部分,并且各部分的大小和形狀完全一致渐尿。
np.hsplit(a,3)
輸出:
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
這個相當于調用了參數axis = 1的split()函數:
np.split(a,3,1)
輸出:
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
縱向拆分:同理
np.vsplit(a,3)
輸出:
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
深向拆分:dsplit()函數會沿著深度方向分解數組矾瑰。
后記:關于本文數據的由來
玩python殴穴,最好在本地安裝Anaconda,里面有notebook的運行環(huán)境采幌,交互式的筆記notebook是最好的工具休傍,沒有之一。
-
下載安裝anaconda炒瘸,運行寝衫,如下圖為主界面
anaconda.png -
點擊"jupyter notebook",可以啟動notebook運行環(huán)境隘截,新建一個notebook python的文檔汹胃,形如界面:
notebook.png 目前網上支持notebook最好的免費平臺就是github了着饥,將自己的notebook文檔上傳到github上可以進行分享。
-
老子《道德經》第十二章呵哨,老子故里,中國鹿邑孟害。 ?