python数字处理技巧(2): Numpy、矩阵运算、随机、字符串日期
1. 大型數(shù)組運(yùn)算 numpy
需要在大數(shù)據(jù)集(比如數(shù)組或網(wǎng)格)上面執(zhí)行計算。涉及到數(shù)組的重量級運(yùn)算操作,可以使用 NumPy 庫。 NumPy 的一個主要特征是給Python提供一個數(shù)組對象,相比標(biāo)準(zhǔn)的Python列表更適合做數(shù)學(xué)運(yùn)算。 下面展示了標(biāo)準(zhǔn)列表對象和 NumPy 數(shù)組對象之間的差別:
import numpy as npx = [1,2,3,4] y = [5,6,7,8] print( x*2 ) # [1, 2, 3, 4, 1, 2, 3, 4] print( x+y ) # [1, 2, 3, 4, 5, 6, 7, 8] """#TypeError: can only concatenate list (not "int") to list""" # print( x+10) nx = np.array(x) ny = np.array(y) print( nx*2 ) # [2 4 6 8] print( nx+ny ) # [ 6 8 10 12] print( nx+10 ) # [11 12 13 14]- ?兩種方案中數(shù)組的基本數(shù)學(xué)運(yùn)算結(jié)果并不相同。 特別的, NumPy 中的標(biāo)量運(yùn)算(比如 ax * 2 或 ax + 10 )會作用在每一個元素上。 當(dāng)兩個操作數(shù)都是數(shù)組的時候執(zhí)行元素對等位置計算,并最終生成一個新的數(shù)組。
- NumPy 還為數(shù)組操作提供了大量的通用函數(shù),這些函數(shù)可以作為 math 模塊中類似函數(shù)的替代。例如, np.sqrt(), np.cos()。使用這些通用函數(shù)要比循環(huán)數(shù)組并使用 math 模塊中的函數(shù)執(zhí)行計算要快的多。 因此,盡量選擇 NumPy 的數(shù)組方案。
- 底層實現(xiàn)中, NumPy 數(shù)組使用了C或者Fortran語言的機(jī)制分配內(nèi)存。 它是一個非常大的連續(xù)的并由同類型數(shù)據(jù)組成的內(nèi)存區(qū)域。 所以,可以構(gòu)造一個比普通Python列表大的多的數(shù)組。 比如,構(gòu)造一個10,000*10,000的浮點數(shù)二維網(wǎng)格。
- 特別主意:numpy擴(kuò)展了Python列表的索引功能 - 特別是對于多維數(shù)組。
2. 矩陣與線性代數(shù)運(yùn)算 numpy
當(dāng)執(zhí)行矩陣和線性代數(shù)運(yùn)算,比如矩陣乘法、尋找行列式、求解線性方程組的時候也可以利用numpy處理。
NumPy 庫有一個矩陣對象可以用來解決這個問題。 矩陣類似上面的數(shù)組對象,但是遵循線性代數(shù)的計算規(guī)則。
- numpy.?matrix()
- numpy.linalg : 行列式、特征值、特征性向量、線性代數(shù)求解等
3. 隨機(jī)選擇 random
可以利用random模塊從一個序列中隨機(jī)抽取若干元素,或者想生成幾個隨機(jī)數(shù)。random 模塊有大量的函數(shù)用來產(chǎn)生隨機(jī)數(shù)和隨機(jī)選擇元素。
import random# 隨機(jī)取單個樣例 values = [1, 2, 3, 4, 5, 6] print( random.choice(values) ) # 1 print( random.choice(values) ) # 5# 隨機(jī)抽取多個樣例 print( random.sample(values, 3) ) # >>> [1, 5, 3] print( random.sample(values, 3) ) # >>> [4, 1, 6]# 打亂數(shù)組/列表的順序 random.shuffle(values) print( values ) # >>> [1, 6, 2, 4, 3, 5]# 生成指定范圍內(nèi)的整數(shù)隨機(jī)數(shù) print( random.randint(0,10) ) # >>> 8# 生成0到1范圍內(nèi)均勻分布的浮點數(shù) print( random.random() ) # >>> 0.38424002551957526Comment:
- random 模塊使用 Mersenne Twister 算法來計算生成隨機(jī)數(shù)。這是一個確定性算法, 但是可以通過 random.seed() 函數(shù)修改初始化種子。
- random模塊還包含基于均勻分布、高斯分布和其他分布的隨機(jī)數(shù)生成函數(shù)。 random.uniform() 計算均勻分布隨機(jī)數(shù), random.gauss() 計算正態(tài)分布隨機(jī)數(shù)。
4. 日期與時間轉(zhuǎn)換 datatime
當(dāng)我們的應(yīng)用程序接受字符串格式輸入,可以將它轉(zhuǎn)換為 datetime 對象并執(zhí)行非字符串操作。
from datetime import datetimetext = '2018-10-28' y = datetime.strptime(text, '%Y-%m-%d') z = datetime.now() diff = z - y print( diff ) # >>> 1 day, 11:00:32.970036datetime.strptime() 方法支持很多的格式化代碼, 比如 %Y 代表4位數(shù)年份, %m 代表兩位數(shù)月份。 還有一點值得注意的是這些格式化占位符也可以反過來使用,將日期輸出為指定的格式字符串形式。
本文參考《python3-codebook》
總結(jié)
以上是生活随笔為你收集整理的python数字处理技巧(2): Numpy、矩阵运算、随机、字符串日期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给程序员的忠告:九种不值得你追随的老板
- 下一篇: python迭代器生成器使用技巧(1):