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

浏览: 1825

这是菜鸟学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转换


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】

来源 | 菜鸟学Python

作者 | xinxin

本文章为菜鸟学Python独家原创稿件,未经授权不得转载









推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册