前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶之NumPy快速入门(四)

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

作者头像
HuangWeiAI
发布2019-09-30 15:56:59
8140
发布2019-09-30 15:56:59
举报
文章被收录于专栏:浊酒清味浊酒清味

引言

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

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

前面课程:

NumPy快速入门(一)

NumPy快速入门(二)

NumPy快速入门(三)

小提示:这篇文章采用了微信公众号自带的代码块功能,可以刷动屏幕查看被隐藏在屏幕右边的代码哦。

概要

1、掌握NumPy中的排序函数,让排序变得得心应手;

2、掌握NumPy中的条件筛选,玩转条件筛选数组元素;

3、掌握NumPy中的线性代数,用程序轻松学习线性代数。

排序

排序在数组中是一个十分重要的功能,我们介绍两个关键的排序函数:

  1. numpy.sort() 函数返回输入数组从小到大的排序值。函数格式如下:
  2. numpy.arg 函数返回的是数组值从小到大的索引值

numpy.sort()的常见格式如下:

代码语言:javascript
复制
numpy.sort(a, axis)

参数说明:

  • a: 要排序的数组
  • axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序。axis=0 按列排序,axis=1 按行排序,默认是按axis=1排序,也就是行排序。

我们通过一个例子来查看sort的功能:

代码语言:javascript
复制
import numpy as np
a = np.array([[3,7],[9,1]])  
print (np.sort(a))
print (np.sort(a, axis =  0))
print (np.sort(a, axis =  1))

讲解:我们建立了一个形状为(2,2)的数组,分别调用三次sort函数,第一次只有一个参数a,也就是被排序的数组,第二三分别设定axis=0和1。

运行结果:

[[3 7]

[1 9]]

[[3 1]

[9 7]]

[[3 7]

[1 9]]

numpy.argsort() 函数返回的是数组值从小到大的索引值。arg是argument的缩写,表示参数,也就是排序的数组值对应的索引序号。

代码语言:javascript
复制
b = np.array([3,  1,  2])
print (np.argsort(b))
print (b[np.argsort(b)])

讲解:对于数组b我们先给出排序后的索引顺序。按照从小到大的顺序,结果应该是[1,2,0]。因为最小的数字是b[1],中间大的数字是b[2],最大的数字是b[0]。如果你把排序索引作为b的新索引,就可以实现对b的排序。

运行结果:

[1 2 0]

[1 2 3]

条件筛选

我们可以通过NumPy中条件筛选函数,来按照条件函数筛选出来我们想要的结果。

numpy.argmax() & numpy.argmin()

numpy.argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引。我们以argmax函数为例子进行讲解。其格式如下:

代码语言:javascript
复制
numpy.argmax(a, axis)

参数说明:

  • 当只有a的时候,输出结果是数组所有元素中的最大值对应的总索引
  • 当axis=0的时候,输出为每一列最大元素的索引
  • 当axis=1的时候,输出为每一行最大元素的索引

我们用代码进行说明:

代码语言:javascript
复制
import numpy as np
a = np.array([[30,40,70],[80,20,10],[50,90,60]])  
print (np.argmax(a)) 
print (np.argmax(a, axis =  0))
print (np.argmax(a, axis =  1))

小提示:可以刷动屏幕查看隐藏的代码哦

讲解:我们尝试了argmax的三种情况,分别对应上面的说明。其中数组a中最大元素是90,总索引为7。当axis=0的时候,从左到右每一列最大数字对应的索引值分别为[1,2,0]。当axis=1的时候,从上到下每一行最大数字对应的索引值分别为[2,0,1]。

运行结果:

7

[1 2 0]

[2 0 1]

numpy.nonzero()

numpy.nonzero() 函数返回输入数组中非零元素的索引:

代码语言:javascript
复制
b = np.array([[30,40,0],[0,20,10],[50,0,60]])  
print (np.nonzero(b))
print (b[np.nonzero(b)])

讲解:对于数组b,我们先打印它的非零元素对应的索引。一个有六个元素是非零的,运行结果的形式是先给定行索引,然后是列索引。然后我们再把索引作为数组b的索引就可以挑选出数组b中所有非零元素,返回形式为一维数组。

运行结果:

(array([0, 0, 1, 1, 2, 2], dtype=int64), array([0, 1, 1, 2, 0, 2], dtype=int64))

[30 40 20 10 50 60]

numpy.where()

numpy.where() 函数返回输入数组中满足给定条件的元素的索引。这个函数的使用频率高,但是经常容易出错。

代码语言:javascript
复制
c = np.arange(9).reshape(3,  3)   
print (np.where(c > 3))
print (c[np.where(c > 3)])

讲解:我们建立了一个形状为(3,3)的数组,里面的元素是从1到9。我们用np.where试图筛选所有大于3的元素。第一步是筛选出所有大于3元素对应的索引,然后把索引作为数组c的索引,就可以筛选出所有大于3的元素出来。

运行结果:

(array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))

[4 5 6 7 8]

线性代数

NumPy 提供了线性代数函数库,该库包含了线性代数所需的所有功能,可以看看下面的说明:

  • dot 两个数组的点积,即元素对应相乘。
  • vdot 两个向量的点积
  • inner 两个数组的内积
  • matmul 两个数组的矩阵积
  • determinant 数组的行列式
  • solve 求解线性矩阵方程
  • inv 计算矩阵的乘法逆矩阵

我们把这些函数大致分为两类,介绍其中比较重要的函数。

第一类·求矩阵的积

代码语言:javascript
复制
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print(np.dot(a,b))
print (np.vdot(a,b))
print (np.matmul(a,b))

讲解:我们尝试三种矩阵求积的函数,其中第一个函数dot负责矩阵相乘;第二个函数vdot求点积,运算公式是1*11+2*12+3*13+4*14=130;第三个函数mutmul和第一个函数dot功能是一样的。

运行结果:

[[37 40]

[85 92]]

130

[[37 40]

[85 92]]

第二类·求行列式相关

代码语言:javascript
复制
b = np.array([[1,2], [3,4]]) 
print (np.linalg.det(b))
print (np.linalg.inv(b))

讲解:我们使用了两个函数。第一个函数求矩阵的行列式,第二个函数求矩阵的逆矩阵。

运行结果:

-2.0000000000000004

[[-2. 1. ]

[ 1.5 -0.5]]

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与机器学习之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • numpy.argmax() & numpy.argmin()
  • numpy.nonzero()
  • numpy.where()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档