python 對矩陣進行復制操作 np.repeat 與 np.tile區別

Candy_GL發表於2018-07-22

python 對矩陣進行復制操作 np.repeat 與 np.tile區別

二者區別

二者執行的是均是複製操作; 
np.repeat:複製的是多維陣列的每一個元素;axis來控制複製的行和列 
np.tile:複製的是多維陣列本身; 
import numpy as np 
通過help 檢視基本的引數 
help(np.repeat) 
help(np.tile)

案例對比

np.repeat

x = np.arange(1, 5).reshape(2, 2)
print(x)
[[1 2]
 [3 4]]
print(np.repeat(x, 2))
[1 1 2 2 3 3 4 4]

對陣列中的每一個元素進行復制 
除了待重複的陣列之外,只有一個額外的引數時,高維陣列也會 flatten 至一維

c = np.array([1,2,3,4])
print(np.tile(c,(4,2)))
[[1 2 3 4 1 2 3 4]
 [1 2 3 4 1 2 3 4]
 [1 2 3 4 1 2 3 4]
 [1 2 3 4 1 2 3 4]]

當然將高維 flatten 至一維,並非經常使用的操作,也即更經常地我們在某一軸上進行復制,比如在行的方向上(axis=1),在列的方向上(axis=0):

print(np.repeat(x, 3, axis=1))
[[1 1 1 2 2 2]
 [3 3 3 4 4 4]]
print(np.repeat(x, 3, axis=0))
[[1 2]
 [1 2]
 [1 2]
 [3 4]
 [3 4]
 [3 4]]

當然更為靈活地也可以在某一軸的方向上(axis=0/1),對不同的行/列複製不同的次數:

print(np.repeat(x, (2, 1), axis=0))
[[1 2]
 [1 2]
 [3 4]]
print(np.repeat(x, (2, 1), axis=1))
[[1 1 2]
 [3 3 4]]

np.tile

python numpy 下的 np.tile有些類似於 matlab 中的 repmat函式。不需要 axis 關鍵字參數,僅通過第二個引數便可指定在各個軸上的複製倍數。

a = np.arange(3)
print(a)
[0 1 2]
print(np.tile(a, 2))
[0 1 2 0 1 2]
print(np.tile(a, (2, 2)))
[[0 1 2 0 1 2]
 [0 1 2 0 1 2]]

第二個引數便可指定在各個軸上的複製倍數。

b = np.arange(1, 5).reshape(2, 2)
print(b)
[[1 2]
 [3 4]]
print(np.tile(b, 2))
[[1 2 1 2]
 [3 4 3 4]]
print(np.tile(b, (1, 2)))
[[1 2 1 2]
 [3 4 3 4]]

相關文章