引言
NumPy是Python的一个扩展库,负责数组和矩阵运行。相较于传统Python,NumPy运行效率高,速度快,是利用Python处理数据必不可少的工具。
这个NumPy快速入门系列分为四篇,包含了NumPy大部分基础知识,每篇阅读时间不长,但内容含量高。大家最好亲自码一遍代码,这样可以更有收获。
前面的课程:
Python进阶之NumPy快速入门(一)
Python进阶之NumPy快速入门(二)
概要
1、掌握NumPy中的数组操作,轻松改变数组形状;
2、掌握NumPy中的字符串,轻松应对文件处理;
3、掌握Python中的统计函数,轻松进行统计分析。
![de2e7ccbaedfe1d746fdeb314077ca67.png](https://i-blog.csdnimg.cn/blog_migrate/2e0098bc3765f69448d53ff804e09cb8.jpeg)
第七节.数组操作
我们将数组操作分成以下几种类型,然后分别介绍
- 数组变形
- 数组翻转
- 数组连接
- 数组分割
数组变形
可以实现数组变形的函数有好几个:
- reshape,最常见的也是最主要的数组变形函数。可以将数组从一个形状转变成另外一个不同的形状。
- flatten,可以将高维数组展开成一维。先建好一个数组A,然后输出A.flatten()就可以完成降维。当然,我们可以选择展开式的秩序order。如果order='F',就是按列展开;如果order='C',就是按行展开。
- ravel,它和flatten功能其实差不多,可以将高维数组展开成一维。而且默认的展开顺序也是order='C',即按行展开。如果选择order='F'就是按列展开。
代码:
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中我们有两种方式来实现数组的翻转:
- transpose函数,将被翻转目标A放到函数中,像这样np.transpose(A)就可以了。
- .T,第二种办法更加简便,就行了直接在目标数组A后面加个.T。
代码:
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]]
数组连接
数组连接顾名思义是将两个或多个数组按照一定的方式连接起来,常用的数组连接有以下几种函数:
- concatenate函数,使用方式是把被连接的数组依次放进去,用逗号隔开,再用括号括起来;还有一个参数axis来指定按照哪一个轴连接。axis默认值是0,意思是沿着第一个轴连接,如果你设置成1,那么就是沿着第二个轴连接。
- stack函数,它和concatenate函数有一点不同。stack函数更多是一种堆叠,会在原来的维度上增加一个维度;而concatenate不会增加维度。
- hstack函数,它是stack函数的变种,其中h的意思是horizontal,水平的。顾名思义,它会将数组按水平的方式连接。关键是hstack不像stack一样增加维度,这一点是很好的。
- vstack函数,也是stack函数的变种,其中v的意思是vertical,垂直的。顾名思义,它会将数组按竖直的方式连接。
代码:
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]]
数组分割
数组分割相当于数组连接的逆向操作,将一个大数组分割成好几个数组。常用的函数有三个:
- split函数,这个函数有三个参数。第一个参数ary就是被分割的数组,第二参数叫indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭),第三个参数axis是按照哪个轴切分。
- hsplit函数,水平方向上切分。
- vsplit函数,竖直方向上切分。
代码:
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数组,其实NumPy中字符串也十分重要,尤其是在涉及到文件处理的时候,因为很多文件比如txt文档只支持字符串(string)格式的读写。因此学会常用NumPy字符串函数是很有必要的。
字符串连接
负责字符串连接的有两个函数,
- 第一个是加法add函数,字符串加法其实就是连接,将两个字符串数组中的字符串连接在一起。
- 第二个是乘法multiply函数。字符串乘法可以看成加法的延展,将字符串复制好几倍然后拼接在一起。
代码:
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
大小写
表格中关于大小写的函数有四个,我们分别来看看它们都是什么功能。
- 第一个函数capitalize将首字母转换成大写,目的是针对写文章的情景,需要把句子中第一个单词的首字母大写,比较实用。
- 第二个函数title是让字符串的每个单词的第一个字母变成大写,和函数名呼应,这个函数的功能是针对文章标题用的,可以把字符串方便转换成文章的标题。
- 第三个函数lower是将数组中每个元素转换成小写。
- 第四个函数upper是将数组中每个元素转换成大写。
代码:
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
符号分割
分割操作在处理文件时候很重要,因为我们一般以一定格式,比如用逗号或者空格隔开数据而且每一行格式尽量一样。我们介绍两种分割函数,它们复制不同尺度:
- 第一个是split函数,通过指定分隔符对字符串进行分割,并返回数组。分隔符的默认值空格。
- 第二个是splitlines函数,从名字可以看出来分割行的,其根据换行符来分割字符串。
代码:
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']
第九节.NumPy统计函数
最大,最小值
- amin函数用于计算数组中的最小值
- amax函数用于计算数组中的最大值
如果我们指定某个轴,那么它们将会返回沿着轴的的最大或者最小的元素,即一个一维数组。当轴的参数是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
中位数,平均值,方差
- median函数负责计算数组的中位数,其关于轴参数的设置规则和上面的是一样,如果设置成0或1就会沿着纵轴或者横轴计算中位数,如果不设置参数的话,就是计算整个数组的中位数
- mean函数会计算数组的平均值,也分为沿着轴计算或者整个数组计算,规则同上面一样。
- 标准差函数std,方差函数是var。其中标准差的平方是方差。我们用最简单的一位数组做实验:
代码:
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.]