Python如何实现大型数组运算(使用NumPy)


Posted in Python onJuly 24, 2020

问题

你需要在大数据集(比如数组或网格)上面执行计算。

解决方案

涉及到数组的重量级运算操作,可以使用NumPy库。NumPy的一个主要特征是它会给Python提供一个数组对象,相比标准的Python列表而已更适合用来做数学运算。下面是一个简单的小例子,向你展示标准列表对象和NumPy数组对象之间的差别:

>>> # Python lists
>>> x = [1, 2, 3, 4]
>>> y = [5, 6, 7, 8]
>>> x * 2
[1, 2, 3, 4, 1, 2, 3, 4]
>>> x + 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> x + y
[1, 2, 3, 4, 5, 6, 7, 8]

>>> # Numpy arrays
>>> import numpy as np
>>> ax = np.array([1, 2, 3, 4])
>>> ay = np.array([5, 6, 7, 8])
>>> ax * 2
array([2, 4, 6, 8])
>>> ax + 10
array([11, 12, 13, 14])
>>> ax + ay
array([ 6, 8, 10, 12])
>>> ax * ay
array([ 5, 12, 21, 32])
>>>

正如所见,两种方案中数组的基本数学运算结果并不相同。特别的,numpy中的标量运算(比如 ax * 2 或 ax + 10 )会作用在每一个元素上。另外,当两个操作数都是数组的时候执行元素对等位置计算,并最终生成一个新的数组。

对整个数组中所有元素同时执行数学运算可以使得作用在整个数组上的函数运算简单而又快速。比如,如果你想计算多项式的值,可以这样做:

>>> def f(x):
... return 3*x**2 - 2*x + 7
...
>>> f(ax)
array([ 8, 15, 28, 47])
>>>

NumPy还为数组操作提供了大量的通用函数,这些函数可以作为math模块中类似函数的替代。比如:

>>> np.sqrt(ax)
array([ 1. , 1.41421356, 1.73205081, 2. ])
>>> np.cos(ax)
array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362])
>>>

使用这些通用函数要比循环数组并使用math模块中的函数执行计算要快的多。因此,只要有可能的话尽量选择numpy的数组方案。

底层实现中,NumPy数组使用了C或者Fortran语言的机制分配内存。也就是说,它们是一个非常大的连续的并由同类型数据组成的内存区域。所以,你可以构造一个比普通Python列表大的多的数组。比如,如果你想构造一个10,000*10,000的浮点数二维网格,很轻松:

>>> grid = np.zeros(shape=(10000,10000), dtype=float)
>>> grid
  array([[ 0., 0., 0., ..., 0., 0., 0.],
  [ 0., 0., 0., ..., 0., 0., 0.],
  [ 0., 0., 0., ..., 0., 0., 0.],
  ...,
  [ 0., 0., 0., ..., 0., 0., 0.],
  [ 0., 0., 0., ..., 0., 0., 0.],
  [ 0., 0., 0., ..., 0., 0., 0.]])
>>>

所有的普通操作还是会同时作用在所有元素上:

>>> grid += 10
>>> grid
array([[ 10., 10., 10., ..., 10., 10., 10.],
  [ 10., 10., 10., ..., 10., 10., 10.],
  [ 10., 10., 10., ..., 10., 10., 10.],
  ...,
  [ 10., 10., 10., ..., 10., 10., 10.],
  [ 10., 10., 10., ..., 10., 10., 10.],
  [ 10., 10., 10., ..., 10., 10., 10.]])
>>> np.sin(grid)
array([[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
    -0.54402111, -0.54402111],
  [-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
    -0.54402111, -0.54402111],
  [-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
    -0.54402111, -0.54402111],
  ...,
  [-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
    -0.54402111, -0.54402111],
  [-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
    -0.54402111, -0.54402111],
  [-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
    -0.54402111, -0.54402111]])
>>>

关于NumPy有一点需要特别的主意,那就是它扩展Python列表的索引功能 - 特别是对于多维数组。为了说明清楚,先构造一个简单的二维数组并试着做些试验:

>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])

>>> # Select row 1
>>> a[1]
array([5, 6, 7, 8])

>>> # Select column 1
>>> a[:,1]
array([ 2, 6, 10])

>>> # Select a subregion and change it
>>> a[1:3, 1:3]
array([[ 6, 7],
    [10, 11]])
>>> a[1:3, 1:3] += 10
>>> a
array([[ 1, 2, 3, 4],
    [ 5, 16, 17, 8],
    [ 9, 20, 21, 12]])

>>> # Broadcast a row vector across an operation on all rows
>>> a + [100, 101, 102, 103]
array([[101, 103, 105, 107],
    [105, 117, 119, 111],
    [109, 121, 123, 115]])
>>> a
array([[ 1, 2, 3, 4],
    [ 5, 16, 17, 8],
    [ 9, 20, 21, 12]])

>>> # Conditional assignment on an array
>>> np.where(a < 10, a, 10)
array([[ 1, 2, 3, 4],
    [ 5, 10, 10, 8],
    [ 9, 10, 10, 10]])
>>>

讨论

NumPy是Python领域中很多科学与工程库的基础,同时也是被广泛使用的最大最复杂的模块。即便如此,在刚开始的时候通过一些简单的例子和玩具程序也能帮我们完成一些有趣的事情。

通常我们导入NumPy模块的时候会使用语句 import numpy as np 。这样的话你就不用再你的程序里面一遍遍的敲入numpy,只需要输入np就行了,节省了不少时间。

如果想获取更多的信息,你当然得去NumPy官网逛逛了,网址是: http://www.numpy.org

以上就是Python如何实现大型数组运算(使用NumPy)的详细内容,更多关于Python 大型数组运算(使用NumPy)的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
记录Django开发心得
Jul 16 Python
python实现括号匹配的思路详解
Aug 23 Python
Python函数装饰器实现方法详解
Dec 22 Python
Python常见数据类型转换操作示例
May 08 Python
python通过matplotlib生成复合饼图
Feb 06 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
python ssh 执行shell命令的示例
Sep 29 Python
Golang Web 框架Iris安装部署
Aug 14 Python
基于opencv的selenium滑动验证码的实现
Jul 24 #Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 #Python
python定义类的简单用法
Jul 24 #Python
Python爬虫抓取指定网页图片代码实例
Jul 24 #Python
详解Flask前后端分离项目案例
Jul 24 #Python
通过实例了解Python异常处理机制底层实现
Jul 23 #Python
Python异常处理机制结构实例解析
Jul 23 #Python
You might like
正则表达式语法
2006/10/09 Javascript
php设计模式 State (状态模式)
2011/06/26 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
JavaScript URL参数读取改进版
2009/01/16 Javascript
自己的js工具 Event封装
2009/08/21 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
Python中time模块和datetime模块的用法示例
2016/02/28 Python
深入理解Python装饰器
2016/07/27 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
详解python中的json和字典dict
2018/06/22 Python
Python 函数返回值的示例代码
2019/03/11 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Python如何给函数库增加日志功能
2020/08/04 Python
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
水务局局长岗位职责
2013/11/28 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
甲午风云观后感
2015/06/02 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
java多态注意项小结
2021/10/16 Java/Android
mysql函数全面总结
2021/11/11 MySQL