『Numpy』常用方法記錄


numpy教程

防止輸出省略號

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()

計數&投票函數

numpy.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]])


計算機視覺中人為建立圖像抖動會使用這個函數:

『cs231n』作業3問題4選講_圖像梯度應用強化

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)                                  # 還原抖動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM