分享

Python进阶之NumPy快速入门(三)

 网摘文苑 2022-11-15 发布于新疆

引言

NumPy是Python的一个扩展库,负责数组和矩阵运行。相较于传统Python,NumPy运行效率高,速度快,是利用Python处理数据必不可少的工具

这个NumPy快速入门系列分为四篇,包含了NumPy大部分基础知识,每篇阅读时间不长,但内容含量高。大家最好亲自码一遍代码,这样可以更有收获。

前面的课程:

Python进阶之NumPy快速入门(一)

Python进阶之NumPy快速入门(二)

概要

1、掌握NumPy中的数组操作,轻松改变数组形状;

2、掌握NumPy中的字符串,轻松应对文件处理;

3、掌握Python中的统计函数,轻松进行统计分析。

文章图片1

第七节.数组操作

我们将数组操作分成以下几种类型,然后分别介绍

  • 数组变形
  • 数组翻转
  • 数组连接
  • 数组分割

数组变形

可以实现数组变形的函数有好几个:

  1. reshape,最常见的也是最主要的数组变形函数。可以将数组从一个形状转变成另外一个不同的形状。
  2. flatten,可以将高维数组展开成一维。先建好一个数组A,然后输出A.flatten()就可以完成降维。当然,我们可以选择展开式的秩序order。如果order='F',就是按列展开;如果order='C',就是按行展开。
  3. 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, '\n', B, '\n', C, '\n', 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中我们有两种方式来实现数组的翻转:

  1. transpose函数,将被翻转目标A放到函数中,像这样np.transpose(A)就可以了。
  2. .T,第二种办法更加简便就行了直接在目标数组A后面加个.T。

代码:

A = np.arange(0,8).reshape(4,2)
B = np.transpose(A)
C = A.T   
print (A, '\n', B, '\n', 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]]

数组连接

数组连接顾名思义是将两个或多个数组按照一定的方式连接起来,常用的数组连接有以下几种函数:

  1. concatenate函数,使用方式是把被连接的数组依次放进去,用逗号隔开,再用括号括起来;还有一个参数axis来指定按照哪一个轴连接。axis默认值是0,意思是沿着第一个轴连接,如果你设置成1,那么就是沿着第二个轴连接。
  2. stack函数,它和concatenate函数有一点不同。stack函数更多是一种堆叠,会在原来的维度上增加一个维度;而concatenate不会增加维度。
  3. hstack函数,它是stack函数的变种,其中h的意思是horizontal,水平的。顾名思义,它会将数组按水平的方式连接。关键是hstack不像stack一样增加维度,这一点是很好的。
  4. 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]]

数组分割

数组分割相当于数组连接的逆向操作,将一个大数组分割成好几个数组。常用的函数有三个:

  1. split函数,这个函数有三个参数。第一个参数ary就是被分割的数组,第二参数叫indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭),第三个参数axis是按照哪个轴切分。
  2. hsplit函数,水平方向上切分。
  3. 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字符串函数是很有必要的。

字符串连接

负责字符串连接的有两个函数,

  1. 第一个是加法add函数,字符串加法其实就是连接,将两个字符串数组中的字符串连接在一起。
  2. 第二个是乘法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

大小写

表格中关于大小写的函数有四个,我们分别来看看它们都是什么功能。

  1. 第一个函数capitalize将首字母转换成大写,目的是针对写文章的情景,需要把句子中第一个单词的首字母大写,比较实用。
  2. 第二个函数title是让字符串的每个单词的第一个字母变成大写,和函数名呼应,这个函数的功能是针对文章标题用的,可以把字符串方便转换成文章的标题。
  3. 第三个函数lower是将数组中每个元素转换成小写。
  4. 第四个函数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

符号分割

分割操作在处理文件时候很重要,因为我们一般以一定格式,比如用逗号或者空格隔开数据而且每一行格式尽量一样。我们介绍两种分割函数,它们复制不同尺度:

  1. 第一个是split函数,通过指定分隔符对字符串进行分割,并返回数组。分隔符的默认值空格。
  2. 第二个是splitlines函数,从名字可以看出来分割行的,其根据换行符来分割字符串。

代码:

print (np.char.split ('www.youtube.com', sep = '.'))
print (np.char.splitlines('i\nlove you.'))

讲解:

注意到调用行分割的时候,我们字符串中\n是换行符,因此会在这个位置进行分割。

运行结果:

['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.]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多