資料處理必修庫numpy
python的編輯器五花八門,眼花繚亂,對於新手來說,最好的就是anaconda。
如果你已經安裝了anaconda,那麼你就已經安裝了numpy,不僅如此,很多常用的庫anaconda都替你安裝好了,如pandas,這就省去了自行安裝的麻煩!
python的標準發行版或任何其他發行版,可以訪問官網獲取資訊
【編者注:蟈蟈強烈推薦使用anaconda,並且在做交流時、教師教學時也建議使用anaconda下的jupyter notebook,交流中對方可以實時地看到**的執行過程,對於學生還可以將上課的內容匯出為html網頁格式,供同學們課下複習,以對課堂知識的內容再現。很多老師害怕課堂**出問題,不敢使用實時**執行,而使用ppt教學,其實效果並不好。】
■ 01 匯入numpy
一旦啟動了乙個新的ipython(spyder)或者jupyter(notebook)會話,就可以匯入numpy模組並按照以下步驟來驗證版本:
import numpy
numpy.version
輸出結果:
1.15.4
輸出結果:
1.15.4
■ 02 理解numpy陣列
python語言的變數型別不必指定,無論何時建立乙個新變數,都會自動識別其型別。例如,下面的內容將自動表示為乙個整數:
a = 5
輸入下面type函式可以得到變數的型別:
type(a)
輸出結果:
intrange (x)函式將建立從0到x–1的所有整數,即整數範圍是左閉右開[0,x),但這些整數形象地說是儲存在容器裡,是散亂的,當你需要它時,你可對他進行調取,如你需要呼叫它為乙個列表,那就是用list來呼叫,當需要呼叫它當作元組時,就是用tuple來呼叫它。如
i_list=list(range(10))
i_list
輸出結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
類似地,我們通過讓python遍歷整數列表i_list中的所有元素,並對每個元素應用str()函式(該函式將乙個數轉換成乙個字串),來建立乙個字串列表:
str_list = [str(i) for i in i_list]
str_list
輸出結果:
[『0』, 『1』, 『2』, 『3』, 『4』, 『5』, 『6』, 『7』, 『8』, 『9』]
可是,用列表進行數**算並不是很靈活。例如,我們想要將i_list中的每個元素都乘以乙個因子2。執行以下操作可能是一種簡單的方法,看看輸出結果是怎樣的:
i_list * 2
輸出結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
其結果是將i_list自身「長度」變長了一倍,變長的部分是把原來的元素複製過來了,這並不是我們想要的!
這就是numpy的用武之地。numpy是專為簡化python中的陣列運算而設計的。我們可以快速將整數列表轉換為乙個numpy陣列:
import numpy as np
i_arr = np.array(i_list)
i_arr
輸出結果:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
讓我們試著將陣列乘以2會怎樣:
i_arr*2
輸出結果:
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
這次是我們要的結果!加法、減法、除法以及很多其他運算也是同樣的。
而且,每個numpy陣列都具有以下屬性:
ndim:維數。
shape:每一維的大小。
size:陣列中元素的總數。
dtype:陣列的資料型別(例如int、float、string等)。
讓我們來看看整數陣列的上述屬性:
print("i_arr ndim: ", i_arr.ndim)
print("i_arr shape: ", i_arr.shape)
print("i_arr size: ", i_arr.size)
print("i_arr dtype: ", i_arr.dtype)
輸出結果:
i_arr ndim: 1
i_arr shape: (10,)
i_arr size: 10
i_arr dtype: int32
從這些輸出中,我們可以看到陣列只包含一維,其包含10個元素且所有元素都是64位的整數。當然,如果你在32位機器上執行這段**,你可能會得到dtype:int 32。
■ 03 通過索引訪問單個陣列元素
在一維陣列中,通過在方括號中指定所需的索引,可以訪問第i個值(從0開始計算),與list一樣:
i_arr
輸出結果:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
再看:int_arr[0]
輸出結果:
0再來一次:
int_arr[0]
輸出結果:
3要從陣列的末尾建立索引,可以使用負索引號:
int_arr[-1]
輸出結果:9再如
int_arr[-3]
輸出結果:
7陣列也可以有類似於list的切片操作,如下所示:
i_arr[2:5]
輸出結果:
array([2, 3, 4])
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
這裡,第一維定義顏色通道(opencv中的藍色、綠色和紅色)。因此,如果這是真實的影象資料,我們可以通過陣列切片輕鬆地獲得第乙個通道中的顏色資訊:
aa3[0,:,:]
輸出結果:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
在opencv中,影象要麼是值在0到1之間的32位浮點陣列,要麼是值在0到255之間的8位整數陣列。因此,使用8位整數,通過指定numpy的dtype屬性並將陣列中的所有1乘以255,我們還可以建立乙個2×4畫素、全為白色的rgb影象:
arr_3d=np.ones((3,2,4),dtype=np.uint8)*255
arr_3d
輸出結果:
array([[[255, 255, 255, 255],
[255, 255, 255, 255]],
[[255, 255, 255, 255],
[255, 255, 255, 255]],
[[255, 255, 255, 255],
[255, 255, 255, 255]]], dtype=uint8)
■ 05 修改陣列的維度
我們也可以修改陣列的「形狀」。如上面的aa3的形狀是(3,2,4),下面將其修改為(4,6)(4行6列)
aa3.reshape(4,6)
結果為:
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
aa3.reshape(4,6)也可以寫成aa3.reshape(4,-1)或者aa3.reshape(-1,6),這裡的-1表示不需要計算,如(4,-1)表示形狀改變為4行,至於多少列計算機自動計算;(-1,6)表示修改為6列,至於多少行計算機自動計算去,當然這裡要能夠分成行列數的乘積等於原來陣列的元素個數,如這裡原來是324=24個元素,所以就不能分成(5,-1),因為24個元素不能被份成5行,若分成5行,則不論多少列,肯定有元素多出來或者不夠用,也就是不能正好分成5行多少列。
■ 06 多維陣列的訪問
作乙個3×4的陣列
import numpy as np
a = np.arange(1,13,1).reshape(3,4)
a輸出如下:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
訪問第一行的數字2,後面兩個中括號,第乙個中括號表示行號,第二個中括號表示列號:
a[0][1]
2訪問第二行資料[ 5, 6, 7, 8]:
a[1]
array([5, 6, 7, 8])
也可以用a[1][:]。
要同時訪問多行多列可以如下操作:
a[1:3][0:2]
array([[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
python資料處理庫 numpy
之前在寫python的資料處理庫的安裝教程時寫過一點介紹。但是不是很詳細,最近在整理複習,所以寫篇部落格整理下。numpy是python科學計算的基礎包,它提供 快速高效的多維陣列物件ndarray 直接對陣列執行數 算及對陣列執行元素級計算的函式 線性代數運算 隨機數生成 將c c fortran...
Python資料處理 numpy 1
python中資料處理最基礎的乙個包 numpy。它能很好的進行資料準備,類似與r語言中的資料框 dataframe 一樣。今天,就來從最基礎的開始學習。import numpy as np data 0.95,0.25,0.89 0.56,0.24,0.91 data np.array data ...
pandas資料處理庫
1 dataframe屬性 屬性或方法 描述dataframe.index dataframe的index 行標籤 dataframe.columns dataframe.columns.tolist dataframe的列標籤 將列名轉換為list結構 dataframe.dtypes 返回dat...