Python之Numpy庫(6)

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()方法可以將向量又小到大進行排序,並返回其索引值。

之後,我們根據其索引值的順序,就可以將向量重新進行排序了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章