Numpy庫的學習(五)

今天繼續學習一下Numpy庫,廢話不多說,整起走

先說下Numpy中,經常會犯錯的地方,就是數據的複製

這個問題不僅僅是在numpy中有,其他地方也同樣會出現

import numpy as np
a = np.arange(12)
b = a
print(b is a)
b.shape = 3,4
print(a.shape)
print(id(a))
print(id(b))

 

先看看這段代碼,我們隨便建立了一個numpy數組

然後我想把a這個值,賦值給b,很簡單的操作,b = a 

那麼我們打印一下b和a是不相等,返回的結果爲True

也就是說,b和a是相等的

那麼我們現在講b做個shape變換

然後在看看a的shape有沒有變換

我們這裏多打印些東西,更容易我們理解

我們看到a 的id,和b 的id 是一樣的,說明a和b,是完全相等的

我改變其中任意一個,都是改變另外一個值。實際上a和b指向的都是內存中的同一個地址

我們接着看下面的代碼

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

我這裏 定義了一個c,這個c也是一種複製,淺複製。用view()

我們在看看c 是不是a,返回的結果則是,False,說明,a和c不相等

我們將c.shape變換爲2,6

打印一下a.shape發現,a的shape還是3,4

那麼我將c中的一個值,修改爲1234

可以看到,打印出來的a也改變了

讓後通過id發現, 他們兩個不是同一個地址。但是我修改的時候會做修改

說明,用view()方法複製出來的數據,相當於python中的淺拷貝。

簡單說,就是a和c他們指向的地址不一樣,但是他們公用一組數據。

但是這個view不推薦使用

下面我們接着看

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

這裏看到,d = a.copy(),a 不是d ,所以打印出來是False

那麼我們讓d 中的 一個元素變成9999

那麼打印一下a和d 發現,a中沒有變化,d中有變化,也就是說

如果我們想讓一個變量,的初始值是a,然後在新的上面做一些變化的時候,一定要用copy來做

下面我們在說說argmax

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])]
print(data_max)

這段代碼可以看出,我們生成了一個5行 4列的矩陣。我們定義維度axis = 0 就是按照列進行選擇

打印一下可以看到,第一列中0.98935825這個值是最大的。我們通過打印ind,得到最大的值是矩陣第一列的第3個元素

也就是元素下標爲2,那麼第二列中,第一個元素最大,下標爲0,以此類推,得到[2 0 3 1]

按行找的話,需要設置維度axis = 1,即可

我們想取到,沒列中,最大的數是多少,可以使用data_max這種取值方式,將矩陣中按照列排列最大的元素是多少,取出來

a = np.arange(0,40,10)
print(a)
b = np.tile(a,(4,2))
print(b)

看到上面這段代碼,我們生成一個向量

然後,通過tile函數,將我們生成的向量傳入進去,讓後按照矩陣進行翻倍變換

得到,4行2列的數據,下面繼續

a = np.array([[4,3,5],[1,2,1]])
print(a)
b = np.sort(a, axis = 1)
print(b)
a.sort(axis = 1)
print('****************')
print(a)
a = np.array([4,3,1,2])
j = np.argsort(a)
print('***************')
print(j)
print('***************')
print(a[j])

首先我們使用sort,將我們的a進行了以行爲主的排序

我們可以看到,使用np.sort和直接.sort的效果是一樣的

np.argsort,則是求出a的索引值,然後再按照a的索引值進行排序

今天就先說到這裏,感謝各位的閱讀,感謝支持!!謝謝!!

發佈了65 篇原創文章 · 獲贊 50 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章