列表推导式比循环更快

事实上,标准Python中有比for循环更快的方案:使用列表推导式。但是列表推导式将产生一个新的列表,而不是直接修改原来列表中的元素。下面的语句执行时,将计算出一个新的列表保存每个正弦值:

>>> x = [math.sin(t) for t in x]

np.sin同样也支持计算单个数值的正弦值。不过值得注意的是,对单个数值的计算math.sin则比np.sin快很多。在Python级别进行循环时,np.sin的计算速度只有math.sin的1/6。这是因为np.sin为了同时支持数组和单个数值的计算,其C语言的内部实现要比math.sin复杂很多。此外,对于单个数值的计算,np.sin的返回值类型和math.sin的不同,math.sin返回的是Python的标准float类型,而np.sin则返回一个float64类型:

>>> type(math.sin(0.5))
<type 'float'>
>>> type(np.sin(0.5))
<type 'numpy.float64'>

通过下标所获取的数组元素的类型为NumPy中所定义的类型。将其转换为Python的标准类型还需要花费额外的时间。为了解决这个问题,数组提供了item()方法,它用来获取数组中的单个元素,并且直接返回标准的Python数值类型:

>>> a = np.arange(6.0).reshape(2,3)
>>> a.item(1,2) # 和a[1,2]类似
5.0
>>> type(a.item(1,2)) # item()所返回的是Python的标准float类型
<type 'float'>
>>> type(a[1,2]) # 下标方式获得的是NumPy的float64类型
<type 'numpy.float64'>

通过上面的例子我们了解了如何最有效率地使用math库和NumPy中的数学函数。因为它们各有优缺点,因此在导入时不建议使用“import *”全部载入,而是应该使用“import numpy as np”载入,这样可以根据需要选择合适的函数。

ufunc是universal function的缩写,意思是这些函数能够作用于narray对象的每一个元素上,而不是针对narray对象操作,numpy提供了大量的ufunc的函数。这些函数在对narray进行运算的速度比使用循环或者列表推导式要快很多,但请注意,在对单个数值进行运算时,python提供的运算要比numpy效率高。

NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。让我们来看一个例子:

>>> x = np.linspace(0, 2*np.pi, 10)
# 对数组x中的每个元素进行正弦计算,返回一个同样大小的新数组
>>> y = np.sin(x)
>>> y
array([  0.00000000e+00,   6.42787610e-01,   9.84807753e-01,8.66025404e-01,   3.42020143e-01,  -3.42020143e-01,-8.66025404e-01,  -9.84807753e-01,  -6.42787610e-01,-2.44921271e-16])

先用linspace产生一个从0到2*PI的等距离的10个数,然后将其传递给sin函数,由于np.sin是一个ufunc函数,因此它对x中的每个元素求正弦值,然后将结果返回,并且赋值给y。计算之后x中的值并没有改变,而是新创建了一个数组保存结果。如果我们希望将sin函数所计算的结果直接覆盖到数组x上去的话,可以将要被覆盖的数组作为第二个参数传递给ufunc函数。例如::

>>> t = np.sin(x,x)
>>> x
array([  0.00000000e+00,   6.42787610e-01,   9.84807753e-01,8.66025404e-01,   3.42020143e-01,  -3.42020143e-01,-8.66025404e-01,  -9.84807753e-01,  -6.42787610e-01,-2.44921271e-16])
>>> id(t) == id(x)
True

sin函数的第二个参数也是x,那么它所做的事情就是对x中的每给值求正弦值,并且把结果保存到x中的对应的位置中。此时函数的返回值仍然是整个计算的结果,只不过它就是x,因此两个变量的id是相同的(变量t和变量x指向同一块内存区域)。

ufunc函数本身还有些方法,这些方法只对两个输入一个输出的ufunc函数有效,其它的ufunc对象调用这些方法时会抛出ValueError异常。

reduce 方法和Python的reduce函数类似,它沿着axis轴对array进行操作,相当于将<op>运算符插入到沿axis轴的所有子数组或者元素当中。

<op>.reduce (array=, axis=0, dtype=None)

例如:

>>> np.add.reduce([1,2,3]) # 1 + 2 + 3
6
>>> np.add.reduce([[1,2,3],[4,5,6]], axis=1) # 1,4 + 2,5 + 3,6
array([ 6, 15])

python 矢量化计算相关推荐

  1. python实现神经网络_3. Python矢量化实现神经网络

    本节课中,我们将学习如何利用Python的矢量化来实现神经网络. 根本上讲,矢量化的目的是为了提高计算的效率,加快计算速度. 矢量化 深度学习想要发挥其优势,一个最重要的前提条件是有足够大量的数据. ...

  2. python数据统计 矢量图_用python中的矢量化解决方案计算max draw down

    Maximum Drawdown是量化金融中常用的一种风险度量,用于评估所经历的最大负收益. 最近,我变得不耐烦的时间来计算最大下降使用我的循环方法.def max_dd_loop(returns): ...

  3. Python中将数据矢量化运算所带来的时间加快

    ➤01 矢量化运算 在<PaddlePaddle深度学习实战>一书中,介绍了在Python中利用Numpy中的矩阵(矢量)运算所带来的速度增加. ▲ PaddlePaddle深度学习实战 ...

  4. 对比python字符串函数,学习pandas的str矢量化字符串函数

    1.概述 python字符串应该是python里面最重要的数据类型了,因此学会怎么处理各种各样的字符串,显得尤为重要. 我们不仅要学会怎么处理单个字符串,这个就需要学习"python字符串函 ...

  5. python numpy逆_python-具有numpy的N * M * M张量的矢量化(部分)逆

    所以我有一个张量的索引为a [n,i,j]的维度为(N,M,M)的张量,我想为N中的每个n求M * M方阵部分的值. 例如,假设我有 In [1]: a = np.arange(12) a.shape ...

  6. GDAL+Python实现栅格影像处理之栅格矢量化及矢量栅格化

    GDAL+Python实现栅格影像处理之栅格矢量化及矢量栅格化 相关概念 使用方法 效果展示 相关概念 栅格矢量化:将栅格数据生成矢量数据. 矢量栅格化:将矢量数据生成栅格数据. 使用方法 栅格矢量化 ...

  7. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例

    python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...

  8. python把文字矢量化_如何将点阵汉字矢量化 | indienova

    那么是不是点阵汉字就已经退出历史舞台了呢?并没有.现在街上能常常见到的简易 LED 屏,很多都还是用的点阵汉字.很多工控或者简易屏幕上,也都还在使用点阵汉字,这是因为同矢量字体相比,点阵汉字占用的空间 ...

  9. Python之数据分析(案例:净额成交量、矢量化、数据曲线平滑)

    文章目录 一.净额成交量 二.标量函数矢量化 三.数据曲线平滑 一.净额成交量 1.案例分析 符号数组a: [10 -20 30 40 -50] 用法:numpy.sign(a) 结果是[1 -1 1 ...

最新文章

  1. MySQL聚簇索引:叶子保存主键或unique字段+data 非聚簇保存索引字段
  2. Spring Boot多数据源配置与使用
  3. [BuildRelease Management]ElectricCommander
  4. 信息技术及其发展_中科院心理研究所隋南教授受邀来校并做“生命科学:研究模式的演变及其整合趋势”学术报告...
  5. 大数据分析关键的5个思维
  6. ie11rtm版升级到最新_解决将Office 2010 Beta升级到RTM(最终版)的问题
  7. hbase的region分区
  8. 金蝶盘点机金蝶条码管理方案实施金蝶仓库条码管理实现方法
  9. ligerui combobox ajax,LigerUI中使用ligerComboBox生成多选下拉框
  10. 收敛交叉映射(convergent cross mapping,CCM)滥觞、2012年Science论文引言部分:Detecting Causality in Complex Ecosystems
  11. 实验二 面向对象(一)(预习报告)
  12. 来听听外国UX设计师的22句话
  13. android投影到win7,求教,如何把安卓手机屏幕投射到win7电脑上-win7投屏设置,手机投屏到电脑win7...
  14. Thermal 芯片工作温度知识总结
  15. Joint fully convolutional and graph convolutional networks for weakly-supervised segmentation of
  16. 关于线程中断thread interrupt
  17. C#NPOI 往excel里面追加一行或者一个Datatable
  18. 零时科技 || TempleDAO攻击事件分析
  19. 计算机组成原理之运算方法和运算器
  20. 蓝牙协议栈开发板 STM32F1 跑蓝牙协议栈 --传统蓝牙串口协议SPP演示以及实现原理

热门文章

  1. 互联网大脑架构分析之腾讯:至少已布局三大AI实验室
  2. 处理IE9下onpropertychange无法触发最简洁的方法
  3. .NET AutoResetEvent ManualResetEvent 信号机制以及Semaphore
  4. MyIE2变Maxthon就来了(转)
  5. Python 输出当前 时分秒 包含毫秒
  6. 搞搞Google谷歌新曲(一)插电源上网还打电话
  7. syslog默认端口_什么是Syslog默认端口和安全端口以及如何配置它?
  8. 深度学习(一)深度前馈网络(deep feedforward network)
  9. 读完这篇,让你真正理解Redis持久化
  10. WPF-MVVM详解