標籤:

花式玩轉多維矩陣|入門這篇就夠了

這是菜鳥學Python的第79篇原創文章

閱讀本文大概需要5分鐘

上一篇寫了數據分析的入門篇,對Numpy講了一丟丟的概念,今天這一篇會詳細介紹numpy的各種花色用法,它是一個非常強大的一個庫,對我們的數據分析很有用.另外後台有同學老是問我,學數據分析到底有啥用,簡單的說你可以分析基金股票的,可以幫你理性的投資賺錢,如果是單身的IT單宅男的話,可以爬取一些婚戀網站,或者你心意的mm的微博,分析她的喜好,如果你懂機器學習的話可以挖掘出更多好玩有趣的信息,總之數據分析很好玩啦~~

在講今天的內容之前,大家先思考一個問題,如果你自己要設計一個開源的庫,專門處理多維數組的,你覺得這樣的庫應該具備哪些功能~~

  • 隨意的獲取任何行列內的數據

  • 隨意的把多維矩陣轉換

  • 多維矩陣的切割

  • 多維矩陣和其他多維矩陣的加加減減

  • 多維矩陣內的數據的排序

  • 多維矩陣內數據的過濾

  • 最好內置一些函數比如取最大小值等等

恭喜你,你想到的上面這些內容numpy全部都具備,而且還有更多的功能,比如科學計算裡面的線性代數,隨機數生成等等.今天我們就把最最常用的一些功能介紹給大家,希望大家以後在用的時候,可以有一些幫助~~

1.數組的創建

首先我們要先引入numpy這個庫,一般我們寫成import numpy as np

一維數組

n1d= np.array([1,2,3,4])

print n1d

>>[1 2 3 4]

或者用arange來創建

n1d= np.arange(1,10,2)

print n1d

>>[1 3 5 7 9]

二維數組

n2d=np.array([[1,2,3,4],[11,12,13,14]])

print n2d

>>

[[ 1 2 3 4]

[11 12 13 14]]

print n3d.shape

>>(2,4)#表示2*4的矩陣

三維數組

n3d=np.array([[[1,2,3],[4,5,6]],

[[100,200,300],[400,500,600]],

])

print n3d.shape

>>(2, 2, 3)#表示是2*2*3的矩陣

2.數組的類型

常用的類型有int,float,string_.bool

3.數組的轉換

a).一維和多維轉換,可以用reshape或者resize轉換

b).行列轉換

print n.T

>>

[[ 0 4 8]

[ 1 5 9]

[ 2 6 10]

[ 3 7 11]

4.數組切片處理

多維數組的切片功能應該算是最花俏的,很多也很複雜,我們細細講:

a).一維切片

n1d= np.array([1,2,3,4])

print n1d[1:3]

>>[2 3]

b).二維數組切片3*4矩陣

n2d=np.array([[1,2,3,4],

ttt[11,12,13,14],

ttt[111,112,113,114]])

#取數據裡面的數據

print n2d[1,3]

>>14

print n2d[1][3]

>>14

按行切片

#取第一行

print row1:,n2d[0]

>>row1: [1 2 3 4]

#取前兩行

print row1 and row2:nn2d[:2]

>>

row1 and row2:

[[ 1 2 3 4]

[11 12 13 14]]

#取倒數兩行

print n2d[-2:]

>>

[[ 11 12 13 14]

[111 112 113 114]]

#按列切片,取第1,2,3列

print col1:,n2d[:,0]

print col2:,n2d[:,1]

print col3:,n2d[:,2]

>>col1: [ 1 11 111]

>>col1: [ 2 12 112]

>>col1: [ 3 13 113]

5.取矩陣的4個角

下面將一些更好玩的高級用法,比如一個4*4的矩陣,我們來取4個角

arr_4_4=np.arange(1,17).reshape(4,4)

print arr_4_4

>>

[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]

[13 14 15 16]]

左上角:

print arr_4_4[:2,:2]

右上角:

print arr_4_4[:2,2:4]

左下角:

print arr_4_4[2:4,:2]

右下角:

print arr_4_4[2:4,2:4

6.多維數組運算

a).兩個多維數組可以非常方便的加,減,乘,除

a1=np.array([[1,2],

ttt[3,4]])

a2=np.array([[10,11],

ttt[12,13]])

print a1+a2

>>

[[11 13]

[15 17]]

print a1*a2

>>

[[10 22]

[36 52]]

b),可以進行比較運算>,<,==,!=,最終產生布爾型數組

n1=np.array([1,4,3])

n2=np.array([1,1,5])

print n1>n2

>>

[False True False]

7.多維數組的過濾

比如有一個1,到30的數組,步長為3

n1=np.arange(1,30,3)

print n1

>>

[ 1 4 7 10 13 16 19 22 25 28]

想過濾出大於20的數,怎麼辦,numpy有非常簡潔的辦法

print n1[n1>20]

>>

[22 25 28]

對於字元串的過濾同樣有效

np_names=np.array([aa,ab,ac,ad,ae,af])

print np_names[np_names>=ac]

>>

[ac ad ae af]

有同學說我還想知道過濾後的數據的在數組裡面的位置,怎麼辦

比如一個4*5矩陣的天氣溫度數據:

wk_temp=np.array([

t[20,19,26,18,17],

t[18,15,16,17,18],

t[16,17,18,23,21],

t[23,28,19,18,22],

t[24,25,23,26,28]

t])

我想知道溫度大於25

print wk_temp[wk_temp>25]

>>[26 28 26 28]

我還想知道在過濾後的數據的位置,用到where這個函數

print np.where(wk_temp>25)

>>

(array([0, 3, 4, 4], dtype=int64), array([2, 1, 3, 4], dtype=int64))

這是啥意思呢:

第一個array是表示行,[0,3,4,4]表達大於25的數據在第0,3,4,4行

第二個array是表示列,[2,1,3,4]表達大於25的數據在第2,1,3,4列

是不是看的有點彆扭,我們用zip來處理一下:

是不是就很清晰了

8.ufunc運算

numpy內置了很多方便快捷的函數,一招鮮吃遍天

1).構造一些特定的矩陣

2).常見的運算

求矩陣的行,列的和,整個的平均值,方差,最大值,最小值等等

#均值

print n1.mean()

>>8.5

#總的和

print n1.sum()

>>136

#每一列的和,注意axis=0表示列

print n1.sum(axis=0)

>>[28 32 36 40]

#每一行的和

print n1.sum(axis=1)

>>[10 26 42 58]

#最大值

print n1.max()

>>16

#最大值的索引

print n1.argmax()

>>15

#最小值

print n1.min()

>>1

#最小值的索引

print n1.argmin()

>>0

#內置的ufunc函數

print np.sqrt(n1)#求平方根

>>

[[ 1. 1.41421356 1.73205081 2. ]

[ 2.23606798 2.44948974 2.64575131 2.82842712]

[ 3. 3.16227766 3.31662479 3.46410162]

[ 3.60555128 3.74165739 3.87298335 4. ]]

print np.sqrt(n1)#求平方

>>

[[ 1 4 9 16]

[ 25 36 49 64]

[ 81 100 121 144]

[169 196 225 256]]

3).排序

#一維排序

n1=np.array([1,10,2,12,9,18])

n1.sort()

print n1

>>

[ 1 2 9 10 12 18]

#二維排序

n2=np.array([[1,10,8],

ttt[7,6,15]]

ttt)

#按行排序

n2.sort(1) #1代表行

print n2

>>

[[ 1 8 10]

[ 6 7 15]]

#按列排序

n2.sort(0)

print n2

>>

[[ 1 7 10]

[ 6 8 15]]

9.隨機數矩陣

numpy裡面有一個random模塊,對原生的python里的random做了擴展,可以非常方便的產生隨機數,特別是科學計算用的,很爽滴,不信來看看

1).隨機矩陣

生產一個3*3的矩陣,數字都是0-1之間

print np.random.rand(3,3)

>>

[[ 0.89170792 0.52748332 0.14700303]

[ 0.36761487 0.75470364 0.36139621]

[ 0.65459868 0.61870498 0.5721093 ]]

2).生成一個隨機序列1-50之間,長度為10個

print np.random.randint(1,50,size=10,dtype=int)

>>

[23 9 8 7 15 37 27 40 6 44]

類似的如果生成10000個1-1000的隨機樣本,是不是很方面

3).生成一個標準的正態分布的樣本3*3矩陣

samples=np.random.normal(size=(3,3))

print samples

>>

[[ 1.17655579 1.94528939 0.54505012]

[-0.05295487 -0.04013651 1.26553832]

[-0.00561981 -0.92933126 -0.84515633]]

還有一些像標準差std,方差var,累計和cumsum,累計積cumprod等等都是內置的,還有一些線性代數等等跟科學計算有關的,大家可以查一下官方文檔 NumPy - NumPy裡面有非常詳細的解釋

花式玩轉Numpy就講到這裡,基本把常用的函數都講了一篇,是不是覺得numpy蠻強大的,玩多維數組是不是一下子腦洞大開,多了很多思路,若有什麼不懂的,也可以留言跟我探討交流.後面寫一篇實戰例子來綜合運用Numpy怎麼玩~~

可以關注微信公眾號 【菜鳥學Python】

更多好玩有趣的Python原創教程,趣味演算法,經驗技巧,行業動態,盡在菜鳥學Python,一起來學python吧

歷史人氣文章

Python語言如何入門用Python寫個彈球的遊戲

Python寫個迷你聊天機器人|生成器的高級用法

用Python破解微軟面試題|24點遊戲一道Google的演算法題 |Python巧妙破解
推薦閱讀:

TAG:Python |