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 相关文章推荐
python实现目录树生成示例
Mar 28 Python
Python求两个list的差集、交集与并集的方法
Nov 01 Python
Python协程的用法和例子详解
Sep 09 Python
Python列表删除的三种方法代码分享
Oct 31 Python
python检测IP地址变化并触发事件
Dec 26 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
Python 切分数组实例解析
Nov 07 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 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
PHP 中的类
2006/10/09 PHP
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
php中截取中文字符串的代码小结
2011/07/17 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
php接口隔离原则实例分析
2019/11/11 PHP
JS 控件事件小结
2012/10/31 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
Python import自定义模块方法
2015/02/12 Python
python获取android设备的GPS信息脚本分享
2015/03/06 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
python开启debug模式的方法
2019/06/27 Python
通过实例解析python描述符原理作用
2020/01/22 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
管理部部长岗位职责
2013/12/05 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS