目前小編的Python學習是按照兩個路徑在一路往下推,希望藉此改變過去大半年的Python一直在入門的狀態。一個路徑就是從純程式語言的角度來學習Python的,包括Python編程基礎、編寫函數、Python高級特性、函數式編程、面向對象編程、多進程和多線程、常用內建模塊和第三方庫等等,旨在學習和鍛鍊編程思維,提高小編自身的coding能力。另一個路徑是按照數據科學的角度來學習Python,這條路徑是想將R語言的數據處理和分析能力搬到Python上,主要是學習一些可用於數據分析的Python庫,包括NumPy、Pandas、SciPy、Matplotlib、Seaborn和scikit-learn等等。
第一個路徑學習所使用的資料是廖雪峰老師Python3教程 廖雪峰Python3教程 。
第二個路徑的學習資料主要來自Python的幫助文檔和Wes McKinney的Python for Data Analysis 一書。各位看官可自行去網上尋找一下這本Python數據分析入門書籍。 先簡單介紹了下小編學習Python主要方法和參考資料,很明顯今天的主題numpy是屬於第二個路徑的內容,下面就開始進入今天的正題。
NumPy簡介NumPy是Python中科學計算庫,其主要對象是包含同種元素的多維數組。在NumPy中數組的維度也叫做軸(axis),軸的個數叫做秩(rank)。小編在這裡有必要跟大家提醒一下,線性代數真的是一門很重要的數學基礎課程,認真學好並精通真的是太重要了。
本文小編主要從如何利用numpy創建一個數組對象、列印數組、numpy對象的基本運算和線性代數運算、數組的索引與切片、變換數組形狀等方面來介紹numpy。
創建一個numpy對象利用numpy創建數組對象方法很多,但最常用的還是 array方法和 arange方法。 先看利用 arange方法創建的數組對象:
#arange方法創建一個數組
import numpy as np
a = np.arange(15).reshape(3,5)
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
#arange()創建數組的另一種方式
np.arange(10,30,5)
array([10, 15, 20, 25])
再看 array方法:
#array方法創建一個數組
b = np.array([6,7,8])
b
array([6, 7, 8])
對創建後的數組對象可以查看一些屬性:
#查看數組維度
a.shape
(3, 5)
#查看數組軸的個數
a.ndim
2
#查看數組對象元素類型
a.dtype
dtype('int32')
#查看對象類型
type(a)
numpy.ndarray
type(b)
numpy.ndarray
可以看到numpy數組類為ndarray。 我們也可以在創建數組的時候就指定元素類型:
#在數組創建時就指定dtype
c = np.array([[1,2],[3,4]], dtype = complex)
c
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
還可以利用一些基礎函數來創建數組:
#創建全零矩陣
np.zeros((3,4))
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
#創建全一矩陣
np.ones((3,4))
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
列印數組從上面的演示大家應該也可以看到,在Python中直接輸入數組對象後返回的是一個帶有array字樣的對象,但使用 print函數對數組對象進行列印顯示的結果就不會有這個字樣了:
#一維數組列印成行
x = np.arange(5)
print(x)
[0 1 2 3 4]
#二維數組列印成矩陣
y = np.arange(10).reshape(2,5)
print(y)
[[0 1 2 3 4]
[5 6 7 8 9]]
#三維數組列印成矩陣列表
z = np.arange(24).reshape(2,3,4)
print(z)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
數組的基本運算既然numpy是科學計算庫,它的進行一些計算也是非常強大的:
#numpy數組對象是按照對應進行運算的
a = np.array([10,20,30,40])
b = np.arange(10,30,5)
c = a - b
c
array([ 0, 5, 10, 15])
b ** 2
array([100, 225, 400, 625], dtype=int32)
a < 35
array([ True, True, True, False], dtype=bool)
#numpy中*按元素進行運算,矩陣乘法使用dot函數
a = np.array([[1,1],[0,1]])
b = np.array([[2,0],[3,4]])
a * b
array([[2, 0],
[0, 4]])
np.dot(a,b)
array([[5, 4],
[3, 4]])
可見,Python矩陣的計算採用的是點乘的方式,跟matlab較為相似。 除了直接的四則運算,還可以複雜一點:
#*=/+=等符號用來更改已存在的數組而不是創建一個新的數組
a *= 3
a
array([[3, 3],
[0, 3]])
b += a #b=b+a
b
array([[ 8, 6],
[ 3, 10]])
#axis參數對數組指定軸進行運算
c = np.arange(12).reshape(3,4)
c
array([12, 15, 18, 21])
#對數組每行取最小值
c.min(axis = 1)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
#對數組每列進行求和計算
c.sum(axis = 0)
array([12, 15, 18, 21])
#numpy也提供一些通用的數學計算函數
b = np.arange(5)
np.exp(b)
array([ 1. , 2.71828183, 7.3890561 , 20.08553692, 54.59815003])
np.sqrt(b)
array([ 1. , 2.71828183, 7.3890561 , 20.08553692, 54.59815003])
利用numpy進行線性代數運算也是非常方便的:
import numpy as np
from numpy.linalg import *
a = np.array([[1,2],[3,4]])
print(a)
[[1 2]
[3 4]]
#求轉置
a.transpose()
array([[1, 3],
[2, 4]])
#求逆
inv(a)
array([[-2. , 1. ],
[ 1.5, -0.5]])
#生成單位陣
np.eye(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
#求跡
np.trace(a)
5
#求解矩陣方程
y = np.array([[5],[7]])
solve(a,y)
array([[-3.],
[ 4.]])
關於numpy的簡單運算小編就例舉這麼多,細加探索numpy遠比你想像的要強大。
數組對象的索引與切片關於切片的知識,小編在之前的Python學習的第一條路徑中就已介紹過了,主要是針對list和tuple對象,將索引和切片應用在數組上也是非常方便的。
a = np.arange(10)**2
a
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81], dtype=int32)
#訪問一個數
a[3]
9
#訪問一串數
a[2:5]
array([ 4, 9, 16], dtype=int32)
#按索引替換元素
a[:6:2] = 2017
a
array([2017, 1, 2017, 9, 2017, 25, 36, 49, 64, 81], dtype=int32)
#給數組反向呈現
a[::-1]
array([ 81, 64, 49, 36, 25, 2017, 9, 2017, 1, 2017], dtype=int32)
#多維數組對每個軸都可以進行索引
def f(x,y):
return x*3+2*y
b = np.fromfunction(f,(5,4),dtype = int)
b
array([[ 0, 2, 4, 6],
[ 3, 5, 7, 9],
[ 6, 8, 10, 12],
[ 9, 11, 13, 15],
[12, 14, 16, 18]])
b[2,3]
12
b[0:5,1]
array([ 2, 5, 8, 11, 14])
#當少於軸數的索引被提供時,則被默認為取整個切片
b[-1]
array([12, 14, 16, 18])
更改數組形狀最後一個需要給大家介紹的是對數組形狀進行更改:
a = np.arange(10,110,10).reshape(2,5)
a
array([[ 10, 20, 30, 40, 50],
[ 60, 70, 80, 90, 100]])
a.shape
(2, 5)
#展開數組
a.ravel()
array([ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
#reshape函數僅改變參數形狀,而resize函數則改變數組本身
a.resize(5,2)
a
array([[ 10, 20],
[ 30, 40],
[ 50, 60],
[ 70, 80],
[ 90, 100]])
可見reshape方法與resize方法還是有著本質的區別。
numpy總結1.創建數組 arange, array, copy, empty, emptylike, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, oneslike, r , zeros, zeros_like
2.轉化 astype, atleast 1d, atleast 2d, atleast 3d, mat
3.操作 array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
4.詢問 all, any, nonzero, where
5.排序 argmax, argmin, argsort, max, min, ptp, searchsorted, sort
6.運算 choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum
7.基礎統計和線性代數 cov, mean, std, var, cross, dot, outer, svd, vdot, eye, transpose, inv, trace
參考資料:
http://www.numpy.org/
往期精彩:
gganimate:構建R語言可視化gif動圖
使用jupyter notebook搭建數據科學最佳交互式環境
R編程特性1:向量與向量化
R Markdown|可能是你數據分析報告最好的解決方案
如何寫出整潔規範的R代碼?是時候討論一下代碼規範性了
R語言向量化運算:apply函數族用法心得
Python面向對象編程:數據封裝、繼承和多態
[譯]為什麼R語言是當今最值得學習的數據科學語言
一個數據科學熱愛者的學習歷程