Python科學計算庫-Numpy之不同複製操作對比
阿新 • • 發佈:2018-12-13
1.三種複製的區別
① ”=“ 直接複製,指向的位置一樣,指向的值也是一樣的
a = np.arange(12)
b = a
print(b is a) #a和b是一樣的嗎?
b.shape = 3,4 #改變b的形狀
print(a.shape) #b改變了,a也隨著改變嗎?
print(id(a))
print(id(b)) #a與b的id指向同一地方嗎?
結果是:
True #a和b是一樣的
(3, 4) #b改變了,a也隨著改變
2594735862928
2594735862928 #a與b指向同一地方
②view淺複製,指向的位置不同,但指向的值是一樣的
c = a.view() #淺複製 print(c is a) c.shape = 2,6 print(a.shape) c[0,4] = 4567 print(a) print(id(a)) print(id(c)) 結果是: False #c與a不同 (3, 4) #c結構改變了,但a沒有改變 [[ 0 1 2 3] [4567 5 6 7] [ 8 9 10 11]] #雖然c結構改變了,a沒有改變,但c的改變了值,a也隨之改變了值 2594735715152 2594726038624 #說明c與a指向的位置不同,但指向的值是一樣的
③copy深複製之後,指向的位置不同,指向的值也不同
a = np.arange(12)
a.shape = 3,4
d = a.copy()
print(d is a)
d[0,1] = 8886
print(d)
print(a)
結果是:
False
[[ 0 8886 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]] #a的值沒變
2.numpy的argmax,tile用法
data = np.sin(np.arange(20)).reshape(5,4) #產生一個20元素矩陣 print(data) index1 = data.argmax(axis=0) #找出每列最大元素索引 print(index1) data_max = data[index1, range(data.shape[1])] #找到每列最大元素 print(data_max) a = np.arange(0, 40, 10) #產生0到40步長為10的陣列 print (a) b = np.tile(a, (3, 4)) #擴充套件陣列為(3,4)矩陣 print(b) 結果是: [[ 0. 0.84147098 0.90929743 0.14112001] [-0.7568025 -0.95892427 -0.2794155 0.6569866 ] [ 0.98935825 0.41211849 -0.54402111 -0.99999021] [-0.53657292 0.42016704 0.99060736 0.65028784] [-0.28790332 -0.96139749 -0.75098725 0.14987721]] [2 0 3 1] [ 0.98935825 0.84147098 0.99060736 0.6569866 ] [ 0 10 20 30] [[ 0 10 20 ..., 10 20 30] [ 0 10 20 ..., 10 20 30] [ 0 10 20 ..., 10 20 30]]