花式玩轉多維矩陣|入門這篇就夠了
這是菜鳥學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 |