Data Science | Numpy基礎(一)

鹹魚普拉思發表於2018-10-16

Data Science | Numpy基礎(一)


什麼是Numpy?

Numpy是Python開源的科學計算工具包,是高階的數值程式設計工具

  • 強大的N維陣列物件:ndarray

  • 可以對陣列結構資料進行運算(不用遍歷迴圈)

  • 有隨機數、線性代數、傅立葉變換等功能

如何安裝?

安裝anaconda科學計算環境

鹹魚也是從新手一步一坑踩過來,深知新手配置環境的不易,所以這裡推薦使用anaconda,裡面整合了許多常用的庫,並且在配置環境時更容易上手。

下載地址:

具體安裝步驟,這裡不再贅述,不懂的朋友可以在交流群中討論,也可以參考下面的博文:

https://cuiqingcai.com/5059.html

安裝Numpy

方法一:安裝anaconda後,numpy是可以直接使用的,無需二次安裝。

方法二:沒有安裝anaconda可以使用pip install numpy安裝。

安裝jupyter notebooks(推薦使用)

方法一:安裝anaconda後,jupyter notebooks是可以直接使用的,無需二次安裝。

方法二:沒有安裝anaconda可以使用pip install jupyter安裝。

Numpy基礎資料結構

匯入

推薦使用from numpy import np

不建議使用from numpy import *, 因為numpy中包含了大量與Python內建函式重名的函式。

生成ndarray

可以使用array生成陣列
舉個例子:

import numpy as np
ar = np.array([[1,2,3,4],[1,2,3,4]])
print(ar, type(ar))

>>>
[[1 2 3 4]
  [1 2 3 4]] <class 'numpy.ndarray'>

除了np.array之外還有其他函式可以建立新陣列,這裡列出常用的幾個:

arange # python range的陣列版
asarray # 將輸入轉換為ndarray
ones # 根據給定的形狀和型別生成全1的陣列
ones_like # 根據給定的陣列生成形狀一樣的全1的陣列
zeros # 根據給定的形狀和型別生成全0的陣列
zeros_like # 根據給定的陣列生成形狀一樣的全1的陣列
eye # 生成一個N*N的特徵矩陣(對角線為1,其餘為0)
linspance # 返回在間隔[開始,停止]上計算的num個均勻間隔的樣本

這裡以zeros,zeros_like以及linspance分別舉例:

arr = np.zeros((3,5))
print(arr)

>>>
[[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

s = np.array([list(range(10)),list(range(10,20))])
print(s)
print(np.zeros_like(s))

>>>
[[ 0  1  2  3  4  5  6  7  8  9]
  [10 11 12 13 14 15 16 17 18 19]]
[[0 0 0 0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0 0 0 0]]

print(np.linspace(10,20,num = 21)) #在10,21之間生成
print(np.linspace(10,20,num = 21, endpoint = False)) #endpoint預設為True,為False時不包含左邊的值
print(np.linspace(10,20,num = 21, retstep = True))# restep顯示步長

>>>
[10.  10.5 11.  11.5 12.  12.5 13.  13.5 14.  14.5 15.  15.5 16.  16.5
 17.  17.5 18.  18.5 19.  19.5 20. ]
[10.         10.47619048 10.95238095 11.42857143 11.9047619  12.38095238
 12.85714286 13.33333333 13.80952381 14.28571429 14.76190476 15.23809524
 15.71428571 16.19047619 16.66666667 17.14285714 17.61904762 18.0952381
 18.57142857 19.04761905 19.52380952]
(array([10. , 10.511. , 11.512. , 12.513. , 13.514. , 14.515. ,
       15.516. , 16.517. , 17.518. , 18.519. , 19.520. ]), 0.5)

這裡除了常用的幾個生成陣列的函式外,列舉一些常用的方法:

import numpy as np
ar = np.array([[1,2,3,4],[1,2,3,4]])
print(ar, type(ar))
print(ar.ndim)#返回陣列的維度的個數
print(ar.shape)#陣列的維度,返回幾行幾列
print(ar.size)#陣列元素的個數
print(ar.dtype)#元素的型別
print(ar.itemsize)#陣列中元素的大小

>>>
[[1 2 3 4]
 [1 2 3 4]] <class 'numpy.ndarray'>
2
(24)
8
int64
8

Numpy通用函式

陣列形狀變換(.T/.reshape()/.resize())

.T是轉置函式,轉置函式對一維陣列無影響

# .T
import numpy as np
ar1 = np.arange(10)
ar2 = np.zeros((2,5))
print(ar1.T)
print(ar2.T)#轉置函式

>>>
[0 1 2 3 4 5 6 7 8 9]
[[0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]]

.reshape(),直接更改陣列的形狀,但更改前後陣列元素個數必須相同

ar1 = np.arange(10)
print(ar1.reshape(2,5))
print(np.reshape(np.arange(16),(2,8)))

>>>
[[0 1 2 3 4]
 [5 6 7 8 9]]
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]]

.resize()

print(np.resize(np.arange(16),(3,5)))  # resize當後面的陣列元素個數小於前面生成的數量時,按照順序迭代
print(np.resize(np.arange(12),(3,5)))  # resize當後面的陣列元素個數大於前面的生成的數量,則隨機填充

>>>
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11  0  1  2]]

陣列的複製

和python中的深淺複製類似:Python | Python學習之深淺複製

陣列的型別轉化

.astype()可以將陣列中元素的型別進行轉化,在numpy中元素型別有以下幾種(太多了就不都寫了):

int8, uint8 #有符號和無符號的8整位整數
int16, uint16 #有符號和無符號的16整位整數
int32, uint32 #有符號和無符號的32整位整數
int64, uint64 #有符號和無符號的64整位整數
float16 #半精度
float32 #單精度
float64 #雙精度
bool #布林
.....

舉個型別轉換的栗子:

ar1 = np.arange(10,dtype=float)
ar2 = ar1.astype(np.int64)
print(ar1,ar2)

>>>
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] [0 1 2 3 4 5 6 7 8 9]

陣列的堆疊

陣列的堆疊有hstack(),vstack()以及stack(),下面分別舉例:

a = np.arange(10)
b = np.arange(10,20)
print(ar1,ar2)
# 橫向連結
print(np.hstack((a,b)))
# 豎向連結
a = np.array([[1],[2],[3]])
b = np.array([['a'],['b'],['c']])
print(np.vstack((a,b)))
# 任意堆疊
a = np.arange(10)
b = np.arange(10,20)
print(np.stack((a,b),axis=1)) # 豎向堆疊
print(np.stack((a,b))) # 橫向堆疊

>>>>
[0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19]
0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[['1']
 ['2']
 ['3']
 ['a']
 ['b']
 ['c']]
[[ 0 10]
 [ 1 11]
 [ 2 12]
 [ 3 13]
 [ 4 14]
 [ 5 15]
 [ 6 16]
 [ 7 17]
 [ 8 18]
 [ 9 19]]
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]]

陣列拆分

陣列拆分同樣分為橫向拆分和豎向拆分。

# 陣列拆分
ar = np.arange(16).reshape(4,4)
print(ar)
print(np.hsplit(ar,2)) #縱向拆分
print(np.vsplit(ar,2)) #橫向拆分

>>>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [1213]]), array([[ 2,  3],
       [ 6,  7],
       [1011],
       [1415]])]
[array([[0123],
       [4567]]), array([[ 8,  91011],
       [12131415]])]

常用計算函式

這裡的計算函式與Python中的計算函式用法相同,這裡不再過多論述。

#計算函式
np.mean() #求平均值
np.max() #最大值
np.min() #最小值
np.gtd() #標準差
np.var() #方差
np.sum() # 其中引數axis=0按列求和axis=1按行求和

鞏固練習

  1. 生成一個一維陣列、二維陣列,並且檢視其shape

  2. 生成一個一維陣列,起始值為5,終點值為15,樣本數為10個

  3. 按照要求建立以下陣列

  4. 建立一個20個元素的陣列,分別改變成兩個形狀:(4,5),(5,6)

  5. 建立一個(4,4)的陣列,把其元素型別改為字元型

  6. 建立一個二維陣列ar,起始值為0,終點值為15,運用陣列的運算方法得到結果:result = ar * 10 +100,並求出result的均值及求和

後臺回覆「作業」檢視作業答案

推薦閱讀

爬蟲 | Python學習之Scrapy-Redis實戰京東圖書

Data Science | Numpy基礎(一)

鹹魚普拉思

一隻鹹魚在程式設計路上的摸爬滾打,記錄摸索中的點點滴滴。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556785/viewspace-2216600/,如需轉載,請註明出處,否則將追究法律責任。

相關文章