1. 程式人生 > >Python+numpy(3).md

Python+numpy(3).md

san 運算 sof 默認 indent rgba repeat CP imu

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