最全的花式玩转多维矩阵|入门这篇就够了
这是菜鸟学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"