numpy基本入門操作彙總一
本文是學習《利用python進行資料分析》的部分筆記,在這裡感謝作者。
Numpy是高效能科學計算和資料分析的基礎包,在這裡只羅列一些numpy的常用功能。
一:匯入Numpy:
import numpy as np
它是一個N維的陣列物件,也就是說,其中的元素必須是同類型的。
二:建立ndarray
使用array函式,引數是一切序列化的物件,比如:
data1=[6,7.5,8,0,1]
>>> arr1=np.array(data1)
>>> arr1
array([ 6. , 7.5, 8. , 0. , 1. ])
巢狀序列會被轉換成為一個多維陣列:
>>> data2=[[1,2,3,4],[5,6,7,8]]
>>> arr2=np.array(data2)
>>> arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
shape函式可以返回各維度大小
>>> arr2.shape
(2, 4)
dtype函式可以返回陣列中資料型別
>>> arr2.dtype
dtype('int32')
zeros和ones分別可以建立指定形狀的全0或者全1陣列,empty可以建立一個沒有任何具體值的陣列,傳入一個元組表示多維陣列範圍
>>> np.zeros((3,2)) array([[ 0., 0.], [ 0., 0.], [ 0., 0.]])>> > np.ones((4,4)) array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])>> > np.empty((2,3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])>> >
ones_like以另一個數組為引數,建立同樣大小的全1陣列:類似還有zeros_like,empty_like
np.ones_like(arr2)
array([[1, 1, 1, 1],
[1, 1, 1, 1]])>
eye函式建立單位矩陣
arange函式類似python內建的range函式:
>>> np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
三:ndarray的資料型別
可以顯示指定陣列資料型別
>>> arr1=np.array([1,2,3],dtype=np.float64)
>>> arr1.dtype
dtype('float64')
可以通過ndarray的astype方法顯示地轉換其dtype
>>> arr=arr1.astype(np.float32)
>>> arr
array([ 1., 2., 3.], dtype=float32)
如果某字串陣列全是數字,也可以用astype將其轉化為數值形式
>>> num_strings=np.array(['1.25','-9.6','42'],dtype=np.string_)
>>> num_strings.astype(float)
array([ 1.25, -9.6 , 42. ])
四:陣列和標量之間的運算
arr*arr,arr-arr,1/arr,arr**0.5都是可以運算的。
五:基本的索引和切片
一維陣列的操作和Python列表的功能差不多:
>>> np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> arr=np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr[5]
5
>>> arr[5:8]=12
>>> arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
跟列表最重要的區別是,陣列切片是原始陣列的檢視,這意味著資料不會被複制,試圖上的所有修改都會直接反映到原陣列上。
如果要得到副本,可以用copy函式
>>> arr1=arr[5:8].copy()
>>> arr1
array([12, 12, 12])
切片索引也跟Python列表的一維物件差不多。
可以利用整形陣列進行索引:
>>> arr=np.empty((8,4))
>>> for i in range(8):
... arr[i]=i
.. .
>>> arr
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])>> >
arr[[4,3,1,0]]
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 1., 1., 1., 1.],
[ 0., 0., 0., 0.]])>> >
注意,這種方式跟切片不一樣,會把資料複製到新陣列之中。
六:陣列的轉置
轉置方法.T
arr=np.arange(15).reshape((3,5))
>>> arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])>> >
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
計算矩陣內積XTX:
>>> arr=np.random.randn(6,3)
>>> np.dot(arr.T,arr)
array([[ 11.22401502, 4.2548458 , -2.84368601],
[ 4.2548458 , 9.0673642 , -4.23048071],
[ -2.84368601, -4.23048071, 3.89732813]])
七:通用函式:對陣列中每一個元素執行運算。
np.abs 求絕對值
np.sqrt 求各元素平方根
np.square 求各元素平方
np.exp 求各元素指數
log ,log10,log2 求對數
ceil 變成大於該值的最小整數
floor 變成小於該值的最大整數
isnan 返回一個表示哪些值是“NAN”的布林型陣列
add 兩個陣列對應相加(subtract,multiply,divide)
八:利用陣列進行資料處理:
np.where函式是三元表示式x if condition else y的向量化版本
>>> xarr=np.array([1.1,1.2,1.3,1.4,1.5])
>>> yarr=np.array([2.1,2.2,2.3,2.4,2.5])
>>> cond = np.array([True,False,True,True,False])
>>> result = np.where(cond,xarr,yarr)
>>> result
array([ 1.1, 2.2, 1.3, 1.4, 2.5])
where在資料分析中經常使用,通常用於根據一個數組產生另一個數組
>>> arr = np.random.randn(4,4)
>>> arr
array([[-0.88678735, 0.41149481, -0.55946983, 0.44320273],
[-0.85065922, -0.89529666, -0.52700649, -0.13264943],
[-0.52438978, -1.10277602, 0.56030451, 1.43615325],
[-1.30382499, 0.3459263 , -1.52122709, 0.40608226]])>> >
np.where(arr>0,2,arr) #只將正值設定為2
array([[-0.88678735, 2. , -0.55946983, 2. ],
[-0.85065922, -0.89529666, -0.52700649, -0.13264943],
[-0.52438978, -1.10277602, 2. , 2. ],
[-1.30382499, 2. , -1.52122709, 2. ]])>