Python科学计算之NumPy入门教程


Posted in Python onJanuary 15, 2017

前言

NumPy是Python用于处理大型矩阵的一个速度极快的数学库。它允许你在Python中做向量和矩阵的运算,而且很多底层的函数都是用C写的,你将获得在普通Python中无法达到的运行速度。这是由于矩阵中每个元素的数据类型都是一样的,这也就减少了运算过程中的类型检测。

矩阵基础

在 numpy 包中我们用数组来表示向量,矩阵和高阶数据结构。他们就由数组构成,一维就用一个数组表示,二维就是数组中包含数组表示。

创建

# coding: utf-8
import numpy as np

a = np.array([
 [1.73, 1.68, 1.71, 4],
 [1, 2, 3, 4],
 [1, 2, 3, 4]
])
print type(a) # <type 'numpy.ndarray'>

ndarray (N-dimensional array object) 意思就是n维数组。例子中就表示一个3行4列的二维数组。

形状

数组的大小可以通过其 shape 属性获得:

print a.shape # (3L,4L)

数组的元素数量可以通过 ndarray.size 得到:

print a.size # 12

使用 ndarray 的 dtype 属性我们能获得数组元素的类型:

print a.dtype # float64

可以用过 shape 重新设置矩阵的形状或者通过 reshape 方法创建一个改变了尺寸的新数组,原数组的shape保持不变:

a.shape = 4, 3
b = a.reshape((2, 6))
# 尽管b的形状是新的,但是a和b是共享数据存储内存区域的,如果b[0][1] = 8 那么a[0][1] 也会是8

数组生成

可以用过 np.arange 来创建数组,参数与range类似:

x = np.arange(0, 10, 1) # arguments: start, stop, step

也可以用 np.linspace 创建等差数列:

x = np.linspace(1, 10, 5) # arguments: start, stop, num元素个数
# [ 1. 3.25 5.5 7.75 10. ]

# np.logspace 是创建等比数列

矩阵运算

计算将变量直接参与运算符,操作符优先级不变:

a = np.random.rand(5, 5)
b = np.random.rand(5, 5)

print a + b
print a - b
print a * b
print a / b
print a ** 2
print a < b
print a > b

一个数组中除了 dot() 函数,其他这些操作都是单元操作。

np_arr = np.array([2,3,34,5,5])
print np.mean(np_arr) # 平均数
print np.median(np_arr) # 中位数
print np.corrcoef(a[0], a[1]) # 判断两个轴的数据是否有相关性
print np.std(np_arr) # 标准差

数据提取

切片索引语法:M[lower:upper:step]

a = np.array([1,2,3,4,5])
a[1:3] # array([2, 3])

# 进行切片赋值时,原数组会被修改
a[1:3] = [-2, -3] # array([ 1, -2, -3, 4, 5])


b = np.random.rand(5, 5)
b[1:4, 1:4] # 提取 1~4 行,1~4列

b > 0.1 #array([False, False, False, ...])
# 因此要提取可以用, 这是利用了布尔屏蔽这个特性
b[ b > 0.1 ]

# where()函数是另一个有用的方式,当需要以特定条件来检索数组元素的时候。只需要传递给它一个条件,它将返回符合条件的元素列表。
c = np.where(b > 0.1)

矩阵运算

NumPy和Matlab不一样,对于多维数组的运算,缺省情况下并不使用矩阵运算,如果你希望对数组进行矩阵运算的话,可以调用相应的函数。

matrix对象

numpy库提供了matrix类,使用matrix类创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和matlab十分类似。但是由于NumPy中同时存在ndarray和matrix对象,因此用户很容易将两者弄混。这有违Python的“显式优于隐式”的原则,因此并不推荐在较复杂的程序中使用matrix。

>>> a = np.matrix([[1,2,3],[5,5,6],[7,9,9]])
>>> a*a**-1
matrix([[ 1.00000000e+00, 1.66533454e-16, -8.32667268e-17],
  [ -2.77555756e-16, 1.00000000e+00, -2.77555756e-17],
  [ 1.66533454e-16, 5.55111512e-17, 1.00000000e+00]])

从数组转换为矩阵可以用m = np.matrix(a) 进行转换, 使用 m.T 可以得到m的转置矩阵。

矩阵求逆

m.I * m
=> matrix([[ 1.00000000e+00+0.j, 4.44089210e-16+0.j],
   [ 0.00000000e+00+0.j, 1.00000000e+00+0.j]])

浅拷贝与深拷贝

为了获得高性能,Python 中的赋值常常不拷贝底层对象,这被称作浅拷贝。使用 copy 进行深拷贝:

b = copy(a)

遍历数组元素

通常情况下,我们是希望尽可能避免遍历数组元素的。因为迭代相比向量运算要慢的多。但是有些时候迭代又是不可避免的,这种情况下用 Python 的 for 是最方便的:

v = np.array([1,2,3,4])

for element in v:
 print(element)

M = np.array([[1,2], [3,4]])

for row in M:
 print("row", row)
 for element in row:
  print(element)

总结

以上就是关于Python科学计算之NumPy的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
使用python在校内发人人网状态(人人网看状态)
Feb 19 Python
python实现simhash算法实例
Apr 25 Python
python绘制多个曲线的折线图
Mar 23 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
Python pip安装模块提示错误解决方案
May 22 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
python如何提升爬虫效率
Sep 27 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 Python
pytorch 使用半精度模型部署的操作
May 24 Python
Python科学计算之Pandas详解
Jan 15 #Python
使用pyecharts无法import Bar的解决方案
Apr 23 #Python
详解Python3中字符串中的数字提取方法
Jan 14 #Python
win7上python2.7连接mysql数据库的方法
Jan 14 #Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 #Python
python实现读取并显示图片的两种方法
Jan 13 #Python
Python中的连接符(+、+=)示例详解
Jan 13 #Python
You might like
生成卡号php代码
2008/04/09 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
房地产销售大学生自我评价分享
2013/11/11 职场文书
美德好少年主要事迹
2014/01/29 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
公司委托书范本5篇
2014/09/20 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
会计求职自荐信
2015/03/26 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js