Numpy 模塊基礎學習

Numpy是Python的第第三方模塊,用于科學計算。

1.屬性
ndim  維度
shape  行數和列數
size  元素個數

列表轉化為數組:

>>>import numpy as np
>>>np.array(list(range(4))) #創建數組
array([0,1,2,3])
>>>a=np.array([list(range(1,4)),list(range(2,5))]) #創建數組
>>>a
array([[1, 2, 3],
       [2, 3, 4]])
>>>a.dim
2
>>>a.shape
(2,3)
>>>a.size
6
2. array的創建
  • 指定數據類型dtype
# 數據類型有幾種:int64,int32,以及flaot,flaot32等,默認為int64
>>>import numpy as np
>>>a=np.array(list(range(4)),dtype=np.int(64))
>>>a.dtype
dtype('int64')
  • 創建一些特殊數組zeros,ones,empty,linspace,arange,reshape
# 利用zeros可以創建元素全部為0的數組
>>>import numpy as np
>>>a=np.zeros((3,4)) # 創建3行4列元素全部為零的數組
>>>a
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>>
# 利用ones 創建元素全部為1的數組
>>>b=np.ones((3,4))
>>>b
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])
>>>
# empty 用來創建全空數組,元素值都接近于零(3.6版本元素直接都為零)
>>>c=np.empty((3,4))
>>>c
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>>
# 利用arange創建連續數組,arange用法類似range
>>>d=np.arange(12).reshape(3,4) #利用arange創建連續數組并用reshape改變數組行列數
>>>d 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
# 利用linespace創建等差數據
>>>e=np.linespace(1,20,10) #從1到20,分10份
>>>e
array([  1.        ,   3.11111111,   5.22222222,   7.33333333,
         9.44444444,  11.55555556,  13.66666667,  15.77777778,
        17.88888889,  20.        ])
3. Numpy基礎運算
  • 基本運算加減乘除,冪運算以及矩陣運算
>>>import numpy as np
>>>a=np.arange(10,41,10)  # 創建數組array([10, 20, 30, 40])
>>>b=np.arange(4)  # 創建數組 array([0, 1, 2, 3])
>>>a-b        #a,b 數組行列數相同,做減法運算
array([10, 19, 28, 37])
>>>a+b
array([10, 21, 32, 43])
>>>a*b
array([  0,  20,  60, 120])
>>>a**b        #以b數組中元素作為a數組中相應元素的冪做運算
array([    1,    20,   900, 64000])
>>>a**2   # 簡單的冪運算
array([ 100,  400,  900, 1600])
>>>np.sin(a)
array([-0.54402111,  0.91294525, -0.98803162,  0.74511316]) # 三角函數運算
>>>a<20   #對數組中的值進行邏輯判斷,返回一個bool值數組
array([ True, False, False, False], dtype=bool)
>>>
# 矩陣乘法dot
>>>np.dot(a,b)   #簡單一維矩陣乘法
200
>>>d=np.arange(1,7).reshape(2,3)
>>>e=np.arange(2,8).reshape(3,2)
>>>np.dot(d,e)   #多維矩陣相乘
array([[28, 34],
       [64, 79]])
#  *表示矩陣點乘,如A*B表示A點乘B矩陣
  • 數組一些其他常用方法sum(),min(),max()
>>>import numpy as np
>>>a=np.random.random((2,4)) #生成1以內的隨機數并創建2行4列的數組
>>>a
array([[ 0.67865178,  0.82898517,  0.19739667,  0.54224819],
       [ 0.74727939,  0.33392007,  0.32268768,  0.81595398]])
>>>np.sum(a)
4.4671229255139142
>>>np.min(a)
0.19739667308187692
>>>np.max(a)
0.82898516901089903
>>>
# 如果僅需要對列或者行進行上述操作,可以加入axis參數,
# axis=0表示對行進行操作,axis=1表示對列進行操作
>>>np.sum(a,axis=1)
array([ 2.24728181,  2.21984112])
  • 另一些常用方法
argmin()    #尋找數組中最小值的索引,支持axis參數
argmax() #尋找數組中最大值的索引,支持axis參數
mean()       #求平均值
average() #也是求平均值
median()     #求中位數. [1,4,5,6]中位數是4.5,平均值是4
cumsum()   #累加,[1,2,3,4]結果為[1,3,6,10]
diff()           #類似累差,如[1,4,5,6]結果為[3,1,1]
nonezero   # 返回非零元素的坐標
sort()        #排序,同樣也支持axis
transpose() #轉置,array.T也可以達到相同的效果
clip(array,array_min,array_max)  #將矩陣中比array_min小的元素變成array_min,將矩陣中比array_max大的元素變成array_max

一些例子

>>>import numpy as np
>>>a=np.arange(12,0,-1).reshape(3,4)
>>>a
array([[12, 11, 10,  9],
       [ 8,  7,  6,  5],
       [ 4,  3,  2,  1]])
>>>np.argmin(a)    # 最小值索引
11
>>>np.argmax(a) # 最大值索引
0
>>>np.mean(a)
6.5
>>>np.average(a)
6.5
>>>np.median(a)    # 偶數個元素無中位數取中位數兩邊值的平均值,奇數個元素直接取中間元素的值
6.5
>>>np.cumsum(a)
array([12, 23, 33, 42, 50, 57, 63, 68, 72, 75, 77, 78]
>>>np.diff(a)
array([[-1, -1, -1],
       [-1, -1, -1],
       [-1, -1, -1]])
>>>np.sort(a)
array([[ 9, 10, 11, 12],
       [ 5,  6,  7,  8],
       [ 1,  2,  3,  4]])
>>>np.transpose(a)
array([[12,  8,  4],
       [11,  7,  3],
       [10,  6,  2],
       [ 9,  5,  1]])
>>>a.T
array([[12,  8,  4],
       [11,  7,  3],
       [10,  6,  2],
       [ 9,  5,  1]])
>>>np.clip(a,4,9)
array([[9, 9, 9, 9],
       [8, 7, 6, 5],
       [5, 5, 5, 5]])
4. 索引與切片

數組索引與字符串列表中的索引用法類似

import numpy as np
# 對于一維數組,索引與string,list一樣
>>>a=np.arange(12,0,-1)
>>>a
[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>>a[1]
12
>>>
# 對于二維數組乃至多維數組索引類似與列表中嵌套列表的索引方式
>>>b=np.arange(12,0,-1).reshape(3,4)
>>>b
array([[12, 11, 10,  9],
       [ 8,  7,  6,  5],
       [ 4,  3,  2,  1]])
>>>b[1][1]
7

數組中的切片與列表字符串小有差別,與R語言中的矩陣相差無異

>>>b=np.arange(12,0,-1).reshape(3,4)
>>>b
array([[12, 11, 10,  9],
       [ 8,  7,  6,  5],
       [ 4,  3,  2,  1]])
>>>b[1,1:3]  # 第二行的第一列第二列
array([7, 6])

flat是一個數組中的迭代器,flatten()函數進行降維操作,將多維數組降為一維數組

>>>b.flatten()
array([12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1]
5. 數組的合并

簡單的數組合并使用vstack()hstack()即可,而對于復雜的合并使用concatenate()則更簡單。

>>>import numpy as np
>>>a=np.array([1,1,1])
>>>b=np.array([2,2,2])
>>>np.vstack((a,b))    # vstack()進行縱向合并,也即堆疊
array([[1, 1, 1],
       [2, 2, 2]])
>>>np.hstack(a,b)  # hstack()進行橫向合并
array([1, 1, 1, 2, 2, 2])

對于一維數組,無法進行轉置,需要先進行一些改變

>>>import numpy as np
>>>a=np.array([1,1,1])[np.newaxis,:]     # 1行3列
>>>a.shape
(1,3)
>>>b=np.array([2,2,2])[:,np.newaxis]   # 3行1列
>>>b.shape
(3,1)
>>>np.vstack((b,b))
array([[2],
       [2],
       [2],
       [2],
       [2],
       [2]])

要合并多個矩陣或者序列時,則用concatenate會更方便

>>>import numpy as np
>>>a=np.array([1,1,1])[:,np.newaxis]
>>>b=np.array([2,2,2])[:,np.newaxis]
>>>np.concatenate((a,b,b,a),axis=0)   # axis=0 表示按行堆疊縱向合并
array([[1],
       [1],
       [1],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [1],
       [1],
       [1]])
>>>np.concatenate((a,b,b,a),axis=1)  # axis=1表示橫向以增加列的方式合并
 array([[1, 2, 2, 1],
       [1, 2, 2, 1],
       [1, 2, 2, 1]])
6. 分割

數組中常用split()以及array_split()進行等量以及不等量分割,分割后的部分可以采用索引的方式取出想要的部分。

>>>import numpy as np
>>>a=np.arange(12).reshape((3,4))
>>>a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
# 利用np.split()進行等量分割
>>>np.split(a,3,axis=0)  # 將a分成幾行
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
>>>np.split(a,2,axis=1)  #將a按列分成2半,每部分2列
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
>>>
# 利用np.array_split()進行不等量分割
>>>np.array_split(a,3,axis=1)  # 將a按列分成2,1,1三列
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]
>>>np.array_split(a,2,axis=0)   # 將a按行分成2,1兩部分
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

其他的分割方式:np.vsplit()np.hsplit()np.vsplit()即縱向按行分割,np.hsplit()即橫向按列分割。但是這兩種分割方式都不支持不等量分割。

>>>import numpy as np
>>>a=np.arange(12).reshape((3,4))
>>>np.hsplit(a,2)    # 相當于np.split(a,2,axis=1),按列分割
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
>>> np.vsplit(a,3)  # 相當于np.split(a,3,axis=0),按行分成三行
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
7. 數組的copy與deep copy

數組的復制與list復制方式類似,分淺復制與深度復制,簡單的復制是使幾個變量指向同一個指針,因此這幾個變量中的一個改變,其余的幾個也會跟著改變,而deep copy方式是將一個變量的值賦給另一個變量,兩者指向不同的指針,只是值相同。

>>>import numpy as np
>>>a=np.arange(4)
>>>a
array([0, 1, 2, 3])
>>>b=a
>>>c=b
>>>d=c       # a,b,c,d四個變量指向同一個地址
>>>e=a.copy() # 將a的值賦給e,兩者指向不同的地址
>>>a[3]=10
>>>a
array([ 0,  1,  2, 10])
>>>b
array([ 0,  1,  2, 10])
>>>e
array([0, 1, 2, 3])

奇怪的是當使用[:]的復制方式時與列表復制出現了不同的結果,列表中的[:]與copy復制效果是相同的,而在數組中卻出現了不同,數組中[:]復制的兩個變量的變化仍然保持一致性

>>>import numpy as np
>>>a=np.arange(4)
>>>b=a
>>>c=a[:]
>>>d=a.copy()
>>>a[3]=10
>>>id(a)
140572616448320
>>>id(b)
140572616448320         # a,b的指針地址相同
>>>id(c)
140572616446080
>>>id(d)
140572616448640 
>>>a
array([ 0,  1,  2, 10])
>>>b
array([ 0,  1,  2, 10])
>>>c
array([ 0,  1,  2, 10]) # a,c的指針地址不同,變化卻是一致的
>>>d
array([0, 1, 2, 3])
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容