1. 程式人生 > >numpy基本入門操作彙總一

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.        ]])>