Numpy學習筆記(三):不同的複製之間的對比
阿新 • • 發佈:2018-12-17
由於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)]