防止輸出省略號
import numpy as np np.set_printoptions(threshold=np.inf)
廣播機制
numpy計算函數返回默認是一維行向量:
import numpy as np
a = [[1,1,1],
[2,2,2],
[3,3,3]]
b = (np.sum(a,axis=1))
c = (np.sum(a,axis=0))
print(b,'\n',c)
# [3 6 9]
# [6 6 6]
所以廣播之實際是高維對一維行向量的廣播:
除法廣播:
b = a/(np.sum(a,axis=1)) c = a/(np.sum(a,axis=0)) print(b,'\n',c) # [[ 0.33333333 0.16666667 0.11111111] # [ 0.66666667 0.33333333 0.22222222] # [ 1. 0.5 0.33333333]] # [[ 0.16666667 0.16666667 0.16666667] # [ 0.33333333 0.33333333 0.33333333] # [ 0.5 0.5 0.5 ]]
向量乘法,加法可以類比:
np.array([1,2,3])*np.array([1,1,1]) # [1 2 3] np.array([1,2,3])*np.array([1]) # [1 2 3] np.array([1,2,3])*np.array([1,1]) # 報錯 np.array([[1],[1],[1]])*np.array([1,2,3]) # [[1 2 3] # [1 2 3] # [1 2 3]]
線性代數相關
np.diag():對角陣生成
np.linalg.det():求行列式
np.linalg.inv():矩陣求逆
np.linalg.eig():對稱陣特征值分解
np.linalg.svd():任意陣SVD分解
通用函數
使單輸入單輸出的函數具備廣播功能,frompyfunc(fun, in_num, out_num),常用f = frompyfunc(fun, 1, 1)
>>> oct_array = np.frompyfunc(oct, 1, 1)
>>> oct_array(np.array((10, 30, 100)))
array([012, 036, 0144], dtype=object)
>>> np.array((oct(10), oct(30), oct(100))) # for comparison
array(['012', '036', '0144'],
dtype='|S4')
np.sum(array1 == array2,dtype=float)
bool轉換為數組默認是整形,需要手動修改為浮點型,比較值得注意的tip,或者說由於python本身不做區分,所以在numpy中必須特別注意數字類型的問題
取整
np.rint(result) # 四舍五入
np.ceil(result) # 向上取整
np.floor(result) # 向下取整
np.unique()
保留數組中不同的值
>>> a=np.random.randint(0,5,8) >>> a array([2, 3, 3, 0, 1, 4, 2, 4]) >>> np.unique(a) array([0, 1, 2, 3, 4]) >>> c,s=np.unique(b,return_index=True) >>> c array([0, 1, 2, 3, 4]) >>> s array([3, 4, 0, 1, 5])(元素出現的起始位置)
np.full((shape), value, type)
numpy數組初始化函數
np.split(array, num)
把數組順序等分
np.fun.at(array, index_array, [array2])
fun需要一個參數時等價np.fun(array[index_array]),多參數用法如下:
Examples
Increment items 0 and 1, and increment item 2 twice:
>>> a = np.array([1, 2, 3, 4]) >>> np.add.at(a, [0, 1, 2, 2], 1) >>> print(a) array([2, 3, 5, 4])Add items 0 and 1 in first array to second array, and store results in first array:
>>> a = np.array([1, 2, 3, 4]) >>> b = np.array([1, 2]) >>> np.add.at(a, [0, 1], b) >>> print(a) array([2, 4, 3, 4])
特色,
#np.add.at(dW, x, dout) #dW[x] += dout # this will not work, see the doc of np.add.at a = np.array([1,2,3,4,5,6,7]) i = np.array([0,1,2,0,1]) b = np.array([1,2,3,4,5]) np.add.at(a, i, b) print(a) a = np.array([1,2,3,4,5,6,7]) i = np.array([0,1,2,0,1]) b = np.array([1,2,3,4,5]) a[i] += b print(a)
輸出如下,即索引重復的時候,只有np.add.at會累積前面的結果,單純的索引會取最后一次的結果覆蓋,
[6 9 6 4 5 6 7]
[5 7 6 4 5 6 7]
np.save() & np.load()
np.save('./bottleneck/{1}/{0}'.format(img.split('/')[-1].split('.')[0], file_name),bottleneck_values)
bottleneck_string = np.load(os.path.join(base_path,
'bottleneck',
train_or_test,
label_name,
bottlenecks_tensor_name))
np.loadtxt()
# 本函數讀取數據后自動轉化為ndarray數組,可以自行設定分隔符delimiter=","
np.loadtxt('housing.data') # 讀取數據
np.insert()
np.insert(scale_data, 0, 1, axis=1) # 數組插入函數
在數組中插入指定的行列,numpy.insert(arr, obj, values, axis=None),和其他數組一樣,axis不設定的話會把數組定為一維后插入,axis=0的話行擴展,axis=1的話列擴展
np.matrix()
學習了numpy中的矩陣類型:np.matrix(),在牛頓法中我用的是matrix,在梯度下降法中我用的是array:
matrix是array的子類,特點是有且必須只是2維,matrix.I()可以求逆,和線代的求逆方法一致,所以繪圖時我不得不才用np.sequeeze(np.asarray())操作來降維,而由於x[:, -1]這種操作對array會自動降維(由兩行變為一行),所以要么使用matrix,要么切片后reshape(2,1),總之不消停。
np.concatenate()
注意到數組拼接方法都是不破壞原數組,單純返回新數組的,且axis=0是行拼接(行數增加),axis=1是列拼接(列數增加),
x_n = np.concatenate((x_n, x_n[:,-1] - np.linalg.inv(H).dot(dx_n)),axis=1)
np.nxis
np.exped_dim
用於擴展維度,numpy不僅有expend_dim這樣的函數,也可以使用np.newaxis標記來實現擴維:
a = np.array([1,2,3,4,5])
a = a[:,np.newaxis]
a
Out[44]:
array([[1],
[2],
[3],
[4],
[5]])
a = np.array([1,2,3,4,5])
a = a[np.newaxis,:]
a
Out[47]:
array([[1, 2, 3, 4, 5]])
array.transpose(1,0,2)
轉置,1維沒效果(並不能行列互化),高維后面參數維轉置順序,假如(T,N,H)經過上面的命令會變為(N,T,H)
np.bincount()
計數&投票函數
np.maximum(X, Y, out=None):
- X 與 Y 逐位比較取其大者;
- 最少接收兩個參數
np.squeeze():剔除長度為一的軸
np.squeeze(np.array([[1,2,3]])) # Out[17]: # array([1, 2, 3]) np.squeeze(np.array([[1],[2],[3]])) # Out[18]: # array([1, 2, 3])
numpy.roll():平移數組行列
>>> x = np.arange(10)
>>> np.roll(x, 2)
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
>>> x2 = np.reshape(x, (2,5)) >>> x2 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> np.roll(x2, 1) array([[9, 0, 1, 2, 3], [4, 5, 6, 7, 8]]) >>> np.roll(x2, 1, axis=0) array([[5, 6, 7, 8, 9], [0, 1, 2, 3, 4]]) >>> np.roll(x2, 1, axis=1) array([[4, 0, 1, 2, 3], [9, 5, 6, 7, 8]])
計算機視覺中人為建立圖像抖動會使用這個函數:
ox, oy = np.random.randint(-max_jitter, max_jitter+1, 2) # 隨機抖動生成 X = np.roll(np.roll(X, ox, -1), oy, -2) # 抖動,注意抖動不是隨機噪聲 pass X = np.roll(np.roll(X, -ox, -1), -oy, -2) # 還原抖動
