Python+numpy(3).md
Python numpy
1.1Python科學計算的介紹
參考資料: http://old.sebug.net/paper/books/scipydoc/numpy_intro.html
http://www.numpy.org/
numpy是一個與數學模型構建、定量分析方法以及利用計算機分析和解決科學問題相關領域。
常用庫: Numpy Scipy Pandas matplotlib
1.2 Numpy之ndarray對象
標準安裝的Python中用列表(list)保存一組值,可以用來當作數組使用,不過由於列表的元素可以是任何對象,因此列表中所保存的是對象的指針。這樣為了保存一個簡單的[1,2,3],需要有3個指針和三個整數對象。對於數值運算來說這種結構顯然比較浪費內存和CPU計算時間。
此外Python還提供了一個array模塊,array對象和列表不同,它直接保存數值,和C語言的一維數組比較類似。但是由於它不支持多維,也沒有各種運算函數,因此也不適合做數值運算。
NumPy的誕生彌補了這些不足,NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray(下文統一稱之為數組)是存儲單一數據類型的多維數組,而ufunc則是能夠對數組進行處理的函數。
1.3 ndarray計算速度
1.4 ndarray基本操作
1.4.1 導入模塊
導入Numpy模塊
import numpy as np
import Numpy as np
1.4.2 對data進行數學操作
1. 生成隨機數
np.random.randn(2,3)
# 產生隨機數,參數控制幾行幾列
data = np.random.randn(2,3)
data
與np.arange()相比,可以模擬出更加符合要求的隨機數。
2. 對data進行數學操作
因為是數組,會自動廣播到所有的元素中。
1.4.3 ndarray的屬性方法
1.創建以及結構變換
np.array([1,2],[3,,4])
#生成11等分的0-1的12個數
np.linspace(0,1 ,12)
#生成等差序列
a=np.arange(12)
#生成等比數列 10^0-10^2有20個元素的等比數列
np.logspace(0, 2, 20)
NumPy 提供了常用的對 ndarray 進行變換的方法.
-
np.reshape: 返回一個按照給定的維度改變的 ndarray.
-
np.resize: 在原位修改 ndarray 的維度.
-
np.repeat: 復制 ndarray 的每個元素的值, 返回一個延長的 ndarray, 需要傳入復制的次數作為參數. 當 ndarray 不是一維的時候, 返回的 ndarray 也會是一維的.
# 新生成一個對象,但是不修改原對象
a.reshape((2,6))
np.ones, np.ones_like
np.zeros, np.zeros_like
創建一個數組, 其中的元素全為 1. np.ones 根據參數設定的緯度創建一個元素為 1 的數組, 而 np.ones_like 則根據一個已有的數組創建和其有相同緯度的元素全為 1 的數組.
np.ones((4, 3))
np.ones_like(data)
2. 與列表區別
ndarray內元素只能是同類型的。
3. 查看元素個數
data.size
4. 查看結構(幾行幾列)
data.shape
查看維數
data.ndim
5. 查看元素類型
data.dtype
1.4.4 基礎切片索引
所有切片索引都可以用來修改元素
1. 切片方式與Python標準方法相同
a[5]、a[:5]、a[-1]、a[1:-1:]#間隔為2
>>> a = np.arange(10)
>>> a[5] # 用整數作為下標可以獲取數組中的某個元素
5
>>> a[3:5] # 用範圍作為下標獲取數組的一個切片,包括a[3]不包括a[5]
array([3, 4])
>>> a[:5] # 省略開始下標,表示從a[0]開始
array([0, 1, 2, 3, 4])
>>> a[:-1] # 下標可以使用負數,表示從數組後往前數
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> a[2:4] = 100,101 # 下標還可以用來修改元素的值
>>> a
array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
>>> a[1:-1:2] # 範圍中的第三個參數表示步長,2表示隔一個元素取一個元素
array([ 1, 101, 5, 7])
>>> a[::-1] # 省略範圍的開始下標和結束下標,步長為-1,整個數組頭尾顛倒
array([ 9, 8, 7, 6, 5, 4, 101, 100, 1, 0])
>>> a[5:1:-2] # 步長為負數時,開始下標必須大於結束下標
array([ 5, 101])
2. 與python列表序列不同,通過下標獲取的新數組是原始數組的一個視圖,與原始數組共享一塊數據空間。
>>>b = a[3:7] # 通過下標範圍產生一個新的數組b,b和a共享同一塊數據空間
>>> b
array([101, 4, 5, 6])
>>> b[2] = -10 # 將b的第2個元素修改為-10
>>> b
array([101, 4, -10, 6])
>>> a # a的第5個元素也被修改為10
array([ 0, 1, 100, 101, 4, -10, 6, 7, 8, 9])
3. 使用整數數列
x[[3,3,1]]
>>>x = np.arange(10,1,-1)
>>> x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[[3, 3, 1, 8]] # 獲取x中的下標為3, 3, 1, 8的4個元素,組成一個新的數組
array([7, 7, 9, 2])
>>> b = x[np.array([3,3,-3,8])] #下標可以是負數
>>> b[2] = 100
>>> b
array([7, 7, 100, 2])
>>> x # 由於b和x不共享數據空間,因此x中的值並沒有改變
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[[3,5,1]] = -1, -2, -3 # 整數序列下標也可以用來修改元素的值
>>> x
array([10, -3, 8, -1, 6, -2, 4, 3, 2])
4. 使用布爾數組
x[[True,False,True]]
從頭開始匹配,不夠的部分默認為false
>>>x = np.arange(5,0,-1)
>>> x
array([5, 4, 3, 2, 1])
>>> x[np.array([True, False, True, False, False])]
>>> # 布爾數組中下標為0,2的元素為True,因此獲取x中下標為0,2的元素
array([5, 3])
>>> x[[True, False, True, False, False]]
>>> # 如果是布爾列表,則把True當作1, False當作0,按照整數序列方式獲取x中的元素
array([4, 5, 4, 5, 5])
>>> x[np.array([True, False, True, True])]
>>> # 布爾數組的長度不夠時,不夠的部分都當作False
array([5, 3, 2])
>>> x[np.array([True, False, True, True])] = -1, -2, -3
>>> # 布爾數組下標也可以用來修改元素
>>> x
array([-1, 4, -2, -3, 1])
5. 通過布爾運算切片
x[x>0.5]
1.4.5 多維數組切片索引
兩個軸方向,分別進行切片,中間用逗號隔開。
a[2::2,2::2]
#多維數組的創建方式和顯示方式
>>>arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>>arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
1.4.6 布爾型索引
1. ~表示T和F反過來
~("a"=="a")結果是False
2. != 不等於
1.5 數組運算
1. 與數字的運算
廣播到每一個元素
2. 數組函數
np.sqrt(ndarray)#開方
np.exp(ndarray)#e為底的元素次冪
np.maximum(ndarr_x,ndarr_y)#對應元素比較,留下大的
np.where(ndarray > 0,2,-2)#if 布爾運算 then 2 else -1
3. 數組方法
ndarray.mean(axis=1)#按照行求均值
ndarray.sum(axis=0)#按照列求和
ndarray.cumsum(axis=0)#按照列累加
ndarray.cumprod(axis=1)#按照行累乘
4. 排序
ndarray.sort(axis=1)
1.6 日期和時間的包
1. from datetime import datetime
用來計算時間
start = datetime.now()
c = function(x)
delta = datetime.now() - start
2. import time
time.clock()
Python+numpy(3).md