1. 程式人生 > >Numpy學習筆記(三):不同的複製之間的對比

Numpy學習筆記(三):不同的複製之間的對比

由於python語言自身的特性,通過賦值的方式, 複製一個變數,其只是將不同的變數名同時指向了一個儲存地址,當兩個變數中的任意一個變數改變內容的時候,所有指向這個內容的變數都將會發生變化。因此如何能像c語言中那樣實現變數的任意改變,並不影響其他變數,是現在要實現的。 複製

#不同的變數,但是指定的位置是相同的
a=np.arange(12)
b=a
print(b is a)
b.shape=(3,4)
print(a.shape)
print(id(a))
print(id(b))

執行結果:

True
(3, 4)
2363408075552
2363408075552

** 從上述的執行結果可以看出不同的變數指向了同一塊記憶體地址,任意的變數都可以改變記憶體地址裡的內容

淺複製

**

#不同的變數指向不同的位置,位置裡共享的內容是一樣的
c=a.view() #淺複製
print(c is a)
c.shape=(2,6)
print(a.shape)
c[0,4]=1234
print(a)
print(id(a))
print(id(c))

執行結果:

False
(3, 4)
[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
2363408075552
2363408074752

上述結果表明,通過淺複製,使得變數的記憶體地址不一樣,但是依舊是一個變數改變影響了另一個。 通過copy的形式可實現完全複製

d =a.copy()
d is a
d[0,0]=999
print(a)
print(d)

執行結果:

[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
[[ 999    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]

**

排序和索引:

**

#資料的排序和索引
data = np.sin(np.arange(20).reshape(5,4))
print(data)
ind =data.argmax(axis=0) #按列查詢最大值返回的是行
print(ind)
data_max=data[ind,range(data.shape[1])]#使用索引值查詢元素,rangw是查詢列
print(data_max)

執行結果:

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

**

排序:

**

#排序
a = np.array([[4,3,5],[1,2,1]])
print(a)
print('-'*10)
b=np.sort(a,axis=1)#按照行排序
print(b)
a.sort(axis=1)
print('-'*10)
print(a)
a=np.array([4,3,1,2]) 
j=np.argsort(a)#預設是從小到大排序,返回的是位置
print('-'*10)
print(j)
print('-'*10)
print([j])

執行結果:

[[4 3 5]
 [1 2 1]]
----------
[[3 4 5]
 [1 1 2]]
----------
[[3 4 5]
 [1 1 2]]
----------
[2 3 1 0]
----------
[array([2, 3, 1, 0], dtype=int64)]