Python不僅适用于研究和原型建構,同時也适用于建構生産系統。
對于高并發,多線程的應用程式,Python不是一種理想的程式設計語言,因為Python有一個叫 全局解釋鎖 的東西,這是一種防止解釋器同時執行多條Python位元組碼指令的機制。這并不是說Python不能執行真正的多線程并行的代碼,隻不過這些代碼不能在單個Python程序中執行而已。
重要的Python庫
NumPy
科學計算的基礎包,提供的功能
- 快速高效的多元數組對象ndarray
- 用于對數組執行元素級計算以及對數組執行數學運算的函數
- 用于讀寫硬碟上基于數組的資料集的工具
- 線性代數運算、 傅裡葉變換,以及随機數的生成
- 用于将C、C++、Fortran代碼內建到Python的工具
對于大部分資料分析應用而言,功能展現有
- 用于資料整理和清理、子集構造和過濾、轉換等快速的矢量化數組運算
- 常用的數組算法,如排序、唯一化、集合運算等
- 高效的描述統計和資料聚合/摘要運作
建立ndarray
使用array函數,接受一切序列化型的對象(包括其他數組),然後産生一個新的含有傳入資料的NumPy數組.資料類型儲存在一個特殊的dtype對象中
import numpy as np
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
print(arr1)

除np.array之外,還有一些函數也可以建立數組。比如zero和ones分别可以建立指定長度或形狀的全0或全1數組
print(np.zeros(10))
print(np.ones(10))
ndarray的資料類型
dtype (資料類型 )是一個特殊對象,含有ndarray将一塊記憶體解釋為特定資料類型所需的資訊
dtype是Numpy如此強大和靈活的原因之一。多數情況下,它們直接映射到相應的機器表示,這使得“讀寫磁盤上的二進制資料流”以及“內建低級語言代碼(如C、Fortran)”等工作變得簡單。數值型dtype的命名方式相同:一個類型名(如float或int),後跟一個表示各元素位長的數字。通過ndarray的astype方法顯示地裝換其dtype
數組和标量之間的運算
矢量化:用數組表達式代替循環
廣播:不同大小的數組之間的運算
布爾型索引
布爾型數組的長度必須跟被索引的軸長度一緻,還可以将布爾型數組跟切片、整數(或整數序列)混合使用
names == 'Bob'
array([True,False,False,True,False,False],dtype=bool)
data[names == 'Bob',2: ]
注意:Python關鍵字and和or在布爾類型數組中無效
數組轉置和軸轉換
轉置(transpose)是重塑的一種特殊形式,它傳回的是源資料的視圖(不會進行任何複制操作)。數組不僅有transpose方法,還有一種特殊的T屬性。對于高維數組,transport需要得到一個由軸編号組成的元組才能對這些軸進行轉置
import numpy as np
arr = np.arange(15).reshape((3,5))
print(arr)
print(arr.T)
print(arr.transpose(1,0))
ndarray還有一個swapaxes方法,需要接受一對軸編号,swapaxes也是傳回資料源的視圖(不會進行任何複制操作)
通用函數:快速的元素級數組函數
通用函數(即ufunc)是一種對ndarray中的資料執行元素級運算的函數。也可以把它看做簡單函數(接受一個或多個标量值,并産生一個或多個标量值)的矢量化包裝器
許多ufunc都是簡單的元素級變體,如sqrt和exp
import numpy as np
arr = np.arange(10)
print(np.sqrt(arr))
print(np.exp(arr))
上面的是一進制(unary)ufunc。另外一些(如add或maximum)接受2個數組(是以也叫二進制(binary)ufunc),并傳回一個結果數組
import numpy as np
from numpy.random.mtrand import randn
x = randn(8)
y = randn(8)
print(x)
print(y)
print(np.maximum(x,y)) #元素級最大值
将條件邏輯表述為數組運算
numpy.where函數是三元表達式x condition else y 的矢量化版本
import numpy as np
xarr = np.array([1.1,1.2,1.3,1.4,1.5])
yarr = np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])
result = np.where(cond,xarr,yarr)
print(result)
數學和統計方法
可以通過數組上的一組資料函數對整個數組或某個軸向的資料進行統計計算
約簡:sum、mean以及标準差std等聚合計算,可以當做數組的執行個體方法調用,也可以當做頂級的NumPy函數使用
但是有的方法不聚合,如cumsum和cumrod,産生一個由中間結果組成的數組
import numpy as np
arr = np.random.randn(5,4)
print(arr.mean())
print(arr.sum())
print(arr.cumsum(0))
print(arr.cumprod(1))
将數組以二進制格式儲存到磁盤
np.save和np.load是讀寫磁盤資料的兩個主要函數。預設情況下,數組是以未壓縮的原始二進制格式儲存在擴充名.npy的檔案中
pandas
提供了使我們能夠快速便捷地處理結構化資料的大量資料結構和函數,使Python成為強大而高效的資料分析環境的重要因素之一
pandas兼具Numpy高性能的數組計算功能以及電子表格和關系型資料庫(如SQL)靈活的資料處理功能。它提供了複雜精細的索引功能,以便更為便捷地重塑、切片和切塊、聚合以及選取資料子集等操作
DataFrame是pandas中最重要的資料結構,它用于将資料表示為一個表格
matplotlib
是最流行的用于繪制資料圖表的Python庫。提供了一種非常好用的互動式資料繪圖環境。繪制的圖表也是互動式,可以利用繪圖視窗中的工具放大圖表中的某個區域或對整個圖表進行平移浏覽
SciPy
是一組專門解決科學計算中各種标準問題域的包的集合,主要包括的包
- scipy.integrate : 數值積分例程和微積分求解器
- scipy.linalg :擴充了由numpy.linalg提供的線性代數例程和矩陣分解功能
- scipy.optimize : 函數優化器(最小化器)以及根查找算法
- scipy.singal :信号處理工具
- scipy.sparse :稀疏矩陣和稀疏線性系統求解器
- scipy.special : 實作許多常用數學函數(如伽瑪函數)的Fortran庫的包裝器
- scipy.stats :标準連續和離散機率分布(如密度函數、采樣器、連續分布函數等)、各種統計檢驗方法,以及更好的描述統計法
- scipy.weave :利用内聯C++代碼加速數組計算的工具
程式設計或資料科學方面的常用術語
資料規整:指的是将非結構化和(或)散亂資料處理為結構化或簡潔形式的整個過程。
僞碼:算法或過程的“僞碼式”描述,而這些代碼本身并不是實際有效的源代碼
文法糖:這是一種程式設計文法,它并不會帶來新的特性,但卻能使代碼更易讀、更易寫
拓展
測試代碼的執行時間:%time和%timeit
基本性能分析:%prun和%run -p
代碼設計提示
- 保留有意義的對象和資料
- 扁平結構比嵌套結構好
- 無懼大檔案
喝口脈動吧
# 在一組值(網絡型)上計算函數sqrt(x^2+y^2)
# np.meshgrid函數接受兩個一維數組,
# 并産生兩個二維矩陣(對應于兩個數組中所有的(x,y)對)
import numpy as np
points = np.arange(-5,5,0.01) #1000個隔離點
xs,ys = np.meshgrid(points,points)
# 對函數的求值運算,把兩個數組當做兩個浮點數那樣編寫
# 表達式即可
import numpy as np
points = np.arange(-5,5,0.01) #1000個隔離點
xs,ys = np.meshgrid(points,points)
z = np.sqrt(xs ** 2 + ys ** 2)
print(z)