1. 程式人生 > >Python科學計算庫-Numpy之不同複製操作對比

Python科學計算庫-Numpy之不同複製操作對比

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]]