Python程序员联盟语言@IT·互联网

最全的花式玩转多维矩阵|入门这篇就够了

2017-05-10  本文已影响152人  菜鸟学python

这是菜鸟学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],

[11,12,13,14],

[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:\n'n2d[: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],

[3,4]])

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

[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([

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

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

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

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

[24,25,23,26,28]

])

我想知道温度大于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],

[7,6,15]]

)

#按行排序

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等等都是内置的,还有一些线性代数等等跟科学计算有关的,大家可以查一下官方文档 http://www.numpy.org/里面有非常详细的解释

花式玩转Numpy就讲到这里,基本把常用的函数都讲了一篇,是不是觉得numpy蛮强大的,玩多维数组是不是一下子脑洞大开,多了很多思路,若有什么不懂的,也可以留言跟我探讨交流.后面写一篇实战例子来综合运用Numpy怎么玩~~

更多精彩内容,源码分享,请关于微信公众号"菜鸟学python"

上一篇下一篇

猜你喜欢

热点阅读