- 2016-6-3:第一次學習。
- 2016-8-23:第二次學習,添加思維導圖。


- 用於數據整理和清理、子集構造和過濾、轉換等快速的矢量化數組運算。
- 常用的數組算法,如排序、唯一化、集合運算等。
- 高效的描述統計和數據聚合/摘要運算。
- 用於異構數據集的合並/連接運算的數據對齊和關系型數據運算。
- 將條件邏輯表述為數組表達式(而不是帶有if-elif-else分支的循環)。
- 數據的分組運算(聚合、轉換、函數應用等)。
由於NumPy關注的是數值計算,因此,如果沒有特別指定,數據類型基本都是
float64(浮點數)。
ndarray:一種多維數組對象。每個對象數組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用於說明數組數據類型的對象)。
- 同構數據多維容器(所有元素必須是相同類型的)
- 精通面向數組的編程和思維方式是成為Python科學計算牛人的一大關鍵步驟
- 創建ndarray:array函數(接受一切序列型的對象);嵌套序列(比如由一組等長列表組成的列表)將會被轉換為一個多維數組
- zeros,ones,empty創建數組,傳入指定形狀(各維度的值)即可。
- arange是Python內置函數range的數組版
- 可以通過ndarray的astype方法顯式地轉換其dtype。
-
矢量化:大小相等的數組之間的任何算術運算都會將運算應用到 元素級。數組與標量的算術運算也會將那個標量值傳播到 各個元素。

索引和切片:
- 跟列表最重要的區別在於,數組切片是原始數組的視圖。這意味着數據不會被復制,視圖上的任何修改都會直接反映到源數組上。如果你想要得到的是ndarray切片的一份副本而非視圖,就需要顯式地進行復制操作,例如arr[5:8].copy()。
- 二維數組:【行索引,列索引】 array[0][2] 等價於 array[0, 2]
- 通過布爾型索引選取數組中的數據,將總是創建數據的副本,即使返回一模一樣的數組也是如此。(Python關鍵字and和or在布爾型數組中無效,需使用&(和)、|(或)之類的布爾算術運算符)
- 花式索引:利用整數數組進行索引。花式索引跟切片不一樣,它總是將數據復制到新數組中。arr[[1, 5, 7, 2], [0, 3, 1, 2]]最終選出的是元素(1,0)、(5,3)、(7,1)和(2,2);用於選取方形區域的索引器實際上是arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]或者arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]
數組轉置和軸對換:
- 簡單的轉置可以使用.T,它其實就是進行軸對換而已。
- 對於高維數組,transpose需要得到一個由軸編號組成的元組才能對這些軸進行轉置。(按照元祖給出的順序重新排維度)
- swapaxes方法接受一對軸編號:此兩個維度調轉





NumPy數組使你可以將許多種數據處理任務表述為簡潔的數組表達式(否則需要編寫循環)。用數組表達式代替循環的做法,通常被稱為
矢量化。
將條件邏輯表述為數組運算:
- np.where
# python版本:
result = []
for i in range(n):
if cond1[i] and cond2[i]:
result.append(0)
elif cond1[i]:
result.append(1)
elif cond2[i]:
result.append(2)
else:
result.append(3)
# np.where版本:
np.where(cond1 & cond2, 0,
np.where(cond1, 1,
np.where(cond2, 2, 3)))
# 算數版本:
result = 1 * cond1 + 2 * cond2 + 3 * -(cond1 | cond2)
數學和統計方法:
可以通過數組上的一組數學函數對整個數組或某個軸向的數據進行統計計算。


用於布爾型數組的方法:
sum 經常被用來對布爾型數組中的True值計數;
any 用於測試數組中是否存在一個或多個True;
all 則檢查數組中所有值是否都是True:
arr = randn(100)
(arr > 0).sum() # Number of positive values
bools = np.array([False, False, True, False])
bools.any()
bools.all()
排序:
- 通過sort方法
- 多維數組可以在任何一個軸向上進行排序,只需將軸編號傳給sort即可
- 頂級方法np.sort返回的是數組的已排序副本,而就地排序則會修改數組本身。
arr = randn(5, 3)
# 就地排序
arr.sort(1)
arr.sort(0)
# 頂級排序
sorted_arr = np.sort(arr)
- 計算數組分位數最簡單的辦法是對其進行排序,然后選取特定位置的值:
large_arr = randn(1000)
large_arr.sort()
large_arr[int(0.05 * len(large_arr))] # 5% quantile
唯一化以及其他的集合邏輯:
- np.unique 用於找出數組中的唯一值並返回已排序的結果
- np.in1d用於測試一個數組中的值在另一個數組中的成員資格,返回一個布爾型數組:
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])

將數組以二進制格式保存到磁盤:
- np.save和np.load是讀寫磁盤數組數據的兩個主要函數。(擴展名為.npy)
- np.savez可以將多個數組保存到一個壓縮文件中。(擴展名為.npz)
存取文本文件:(更關注pandas中的read_csv和read_table函數)
- np.loadtxt 或更為專門化的 np.genfromtxt (面向的是結構化數組和缺失數據處理)將數據加載到普通的NumPy數組中。
- np.savetxt
線性代數(如矩陣乘法、矩陣分解、行列式以及其他方陣數學等):
- dot 函數:矩陣乘法
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
x.dot(y) # equivalently np.dot(x, y)

隨機數生成:
numpy.random模塊:更高效。

