1、numpy的3中複製方法
第一種方法:
a = np.arange(12)
b = a
print(b is a)
#運行結果:
True
首先,我們獲得1個變量a,然後將a賦值給b,然後進行布爾值判斷,發現b is a返回True。
b.shape = (3, 4)
print(a.shape)
print(id(a))
print(id(b))
#運行結果:
(3, 4)
47700192
47700192
然後,我們對b使用shape方法將其變爲一個3行4列的矩陣,同時打印a的shape發現,也變成了3行4列。
最後,我們採用id()方法調取a和b的內存位置,發現完全相同,說明a和b指向同一個內存地址。
第二種方法:
a = np.arange(12)
c = a.view()
print(c is a)
#運行結果:
False
然後,我們對c使用shape方法進行改變,然後觀察a的shape是否變化:
c.shape = (2, 6)
print(a.shape)
#運行結果:
(12,)
可以發現,a和c的shape結構並不相同。接下來,我們打印一下a和c的內存地址:
print(id(a))
print(id(c))
#運行結果:
50976992
192259440
可以發現,內存地址也不同。
然鵝,見證奇蹟的時刻到了……
c[0, 4] = 1234
print(a)
#運行結果:
[ 0 1 2 3 1234 5 6 7 8 9 10 11]
我們把c中的某一個元素進行了改變,然後打印a,發現a對應的元素居然也發生了變化。
原因在於,a和c雖然內存地址不同,但共享數據,共用一套值……(好吧,其實我也沒聽懂)
第三種方法:
a = np.arange(12)
a.shape = (3, 4)
d = a.copy()
print(d is a)
#運行結果:
False
依然還是獲取矩陣a,使用copy()方法賦值給d,然後使用布爾值判斷,得到False。
d[0, 0] = 9999
print(d)
print('-----')
print(a)
#運行結果:
[[9999 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
-----
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
OK,我們把d中第一行第一列的元素變成9999,然後分別打印d和a,發現d發生變化,但是a沒有變。
copy()方法也是Numpy中最常用的複製方法。
2、一些排序和索引的問題
data = np.sin(np.arange(20).reshape(5, 4))
print(data)
#運行結果:
[[ 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]]
首先,獲取矩陣data。然後我們獲取當前矩陣中元組最大值的索引:
ind = data.argmax(axis=0)
print(ind)
#運行結果:
[2 0 3 1]
使用argmax()方法,我們找到了[2 0 3 1],這個是啥?
2、0、3、1四個數字代表的意思是,第1列中第3個數字最大,第2列中第1個數字最大……這樣就把索引找到了。axis=0代表按列計算。
索引值找到了,我們就可以利用索引值去找最大的數字了:
data_max = data[ind, range(data.shape[1])]
print(data_max)
#運行結果:
[0.98935825 0.84147098 0.99060736 0.6569866 ]
data_max = data[ind, range(data.shape[1])]需要解釋一下:
ind代表第一列最大值在第幾行。data.shape == (5, 4), 所以data.shape[1] == 4, range(data.shape[1]) == range(4)
看着寫得挺複雜,其實意思就是按照每一列來找。
3、矩陣的擴展
a = np.arange(0, 40, 10)
print(a)
print('--------------')
b = np.tile(a, (3, 5))
print(b)
#運行結果:
[ 0 10 20 30]
--------------
[[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]]
使用tile()方法進行擴展,行變爲原來的3倍,列變爲原來的5倍。
4、對矩陣中的數進行排序
首先,我們獲得一個矩陣:
a = np.array([[4, 3, 5], [1, 2, 1]])
print(a)
#運行結果:
[[4 3 5]
[1 2 1]]
然後,我們對這個矩陣通過行進行排序:
b = np.sort(a, axis=1)
print(b)
#運行結果:
[[3 4 5]
[1 1 2]]
可以看到,第一行、第二行均進行了升序排列。
然後,我們使用其他方法進行排序:
a = np.array([4, 3, 1, 2])
j = np.argsort(a)
print(j)
print('---------')
print(a[j])
#運行結果:
[2 3 1 0]
---------
[1 2 3 4]
使用argsort()方法可以將向量又小到大進行排序,並返回其索引值。
之後,我們根據其索引值的順序,就可以將向量重新進行排序了。