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学习之编写查询ip程序
Feb 27 Python
解决python "No module named pip" 的问题
Oct 13 Python
在python 中实现运行多条shell命令
Jan 07 Python
python实现合并两个排序的链表
Mar 03 Python
Django保护敏感信息的方法示例
May 09 Python
python实现感知机线性分类模型示例代码
Jun 02 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
sklearn+python:线性回归案例
Feb 24 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
简单的Python人脸识别系统
Jul 14 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
10款最佳Python开发工具推荐,每一款都是神器
Oct 15 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
php中的数组操作函数整理
2008/08/18 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
python解析json串与正则匹配对比方法
2018/12/20 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
日期和时间问题
2015/01/04 面试题
羽毛球比赛策划方案
2014/06/13 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
六一儿童节标语
2014/10/08 职场文书
中学生自我评价2015
2015/03/03 职场文书
工作会议通知
2015/04/15 职场文书
Python常遇到的错误和异常
2021/11/02 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers