NumPy是Python的一个扩展库,负责数组和矩阵运行。相较于传统Python,NumPy运行效率高,速度快,是利用Python处理数据必不可少的工具。
这个NumPy快速入门系列分为四篇,包含了NumPy大部分基础知识,每篇阅读时间不长,但内容含量高。大家最好亲自码一遍代码,这样可以更有收获。
前面的课程:
Python进阶之NumPy快速入门(一)
Python进阶之NumPy快速入门(二)
1、掌握NumPy中的数组操作,轻松改变数组形状;
2、掌握NumPy中的字符串,轻松应对文件处理;
3、掌握Python中的统计函数,轻松进行统计分析。
我们将数组操作分成以下几种类型,然后分别介绍
数组变形
可以实现数组变形的函数有好几个:
代码:
import numpy as np
A = np.arange(0,12)
B = A.reshape(2,6)
C = B.flatten(order='F')
D = B.ravel()
print (A, '', B, '', C, '', D)
讲解:
原始数组A是一个从0到11的一维数组;B是通过reshape函数改造成2*6的二维数组;C和D分别从B展开降到一维。其中C是按列顺序降维,而D是按照行顺序。
运行结果:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
[ 0 6 1 7 2 8 3 9 4 10 5 11]
[ 0 1 2 3 4 5 6 7 8 9 10 11]
数组翻转
从数学角度而言,二维数组就是矩阵。在矩阵操作中,有一项叫转置,是将矩阵元素位置的行列互换,比如原来在(1,2)这个位置的元素,会和(2,1)这个位置的元素进行互换。在Numpy中我们有两种方式来实现数组的翻转:
代码:
A = np.arange(0,8).reshape(4,2)
B = np.transpose(A)
C = A.T
print (A, '', B, '', C)
讲解:
A是一个4*2的数组,B和C分别通过两种方式翻转A,虽然函数不同,但是结果却是一样的。
运行结果:
[[0 1]
[2 3]
[4 5]
[6 7]]
[[0 2 4 6]
[1 3 5 7]]
[[0 2 4 6]
[1 3 5 7]]
数组连接
数组连接顾名思义是将两个或多个数组按照一定的方式连接起来,常用的数组连接有以下几种函数:
代码:
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
print (np.concatenate((A,B),axis = 1))
print (np.stack((A,B),1))
print (np.hstack((A,B)))
print (np.vstack((A,B)))
讲解:
A和B都是2*2的数组,我们分别用四个函数去连接它们。第一个是concatenate函数,axis=1表示沿着第二个轴,也就是水平连接;第二个是stack函数,同样是沿着第二个轴,在这里我们省略了axis参数;第三个是hstack,竖直方向连接;第四个是vstack,水平方向连接。
运行结果:
[[1 2 5 6]
[3 4 7 8]]
[[[1 2]
[5 6]]
[[3 4]
[7 8]]]
[[1 2 5 6]
[3 4 7 8]]
[[1 2]
[3 4]
[5 6]
[7 8]]
数组分割
数组分割相当于数组连接的逆向操作,将一个大数组分割成好几个数组。常用的函数有三个:
代码:
A = np.arange(0,16).reshape(4,4)
print (np.split(A,2))
print (np.hsplit(A,2))
print (np.vsplit(A,2))
讲解:
A是一个4*4的二维数组,我们用了三种方式去分割。
运行结果:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
一直以来,我们处理的都是由数字组成的NumPy数组,其实NumPy中字符串也十分重要,尤其是在涉及到文件处理的时候,因为很多文件比如txt文档只支持字符串(string)格式的读写。因此学会常用NumPy字符串函数是很有必要的。
字符串连接
负责字符串连接的有两个函数,
代码:
import numpy as np
print(np.char.add(['hello'],[' world']))
print(np.char.add(['hello','hi'],[' world',' universe']))
print(np.char.multiply('Love you ',3))
讲解:
我们发现当加法函数中的数组里面字符串元素不止一个的时候,连接会按照一一对应的方式配对连接。
运行结果:
['hello world']
['hello world' 'hi universe']
Love you Love you Love you
大小写
表格中关于大小写的函数有四个,我们分别来看看它们都是什么功能。
代码:
print (np.char.capitalize('love you'))
print (np.char.title('i love you'))
print (np.char.lower('LOVE YOU'))
print (np.char.upper('love you'))
讲解:
我们分别用例子尝试了一下大小写函数,还是非常容易的。
运行结果:
Love you
I Love You
love you
LOVE YOU
符号分割
分割操作在处理文件时候很重要,因为我们一般以一定格式,比如用逗号或者空格隔开数据而且每一行格式尽量一样。我们介绍两种分割函数,它们复制不同尺度:
代码:
print (np.char.split ('www.youtube.com', sep = '.'))
print (np.char.splitlines('ilove you.'))
讲解:
注意到调用行分割的时候,我们字符串中是换行符,因此会在这个位置进行分割。
运行结果:
['www', 'youtube', 'com']
['i', 'love you.']
符号连接
既然有按照符号进行分割,其逆操作按符号进行连接。这个函数就是join.
代码:
print (np.char.join([':','-'],['love','google']))
讲解:
这里有两个连接符冒号和一横,分别对应两个字符串。
运行结果:
['l:o:v:e' 'g-o-o-g-l-e']
最大,最小值
如果我们指定某个轴,那么它们将会返回沿着轴的的最大或者最小的元素,即一个一维数组。当轴的参数是0的时候,会返回沿着纵轴最大或者最小元素;当轴的参数是1的时候,会返回沿着横轴最大或者最小的元素。如果我们不设定轴的参数,那么结果会返回这个数组的最大或者最小的元素。
代码:
import numpy as np
A = np.arange(12).reshape(3,4)
print (np.amin(A,0))
print (np.amax(A,1))
print (np.amax(A))
讲解:
我们建立了一个形状为(3,4)的数组。第一个是求沿着纵轴每个列中最小的元素,因为数组有四列,因而会选出四个数字;第二个是求沿着横轴每个行中最大的元素,因为数组有三行,因而会选出三个数字。最后我们没有设定轴,因为会返回A数组中最大的元素。
运行结果:
[0 1 2 3]
[ 3 7 11]
11
中位数,平均值,方差
代码:
A = np.arange(9).reshape(3,3)
print (np.median(A))
print (np.median(A,0))
print (np.median(A,1))
print (np.mean(A))
print (np.mean(A,0))
print (np.mean(A,1))
讲解:
这次我们建立了一个形状为(3,3)的数组,把三种关于轴参数的情况都试了一次,大家对照规则自己想一下答案,再和打印结果对照一下。按照惯例,mean函数的三种用法都尝试一遍。注意到,结果会同中位数结果一样,因为A数组行或列的均值也是中位数。
运行结果:
4.0
[3. 4. 5.]
[1. 4. 7.]
4.0
[3. 4. 5.]
[1. 4. 7.]