实例详解Python中的numpy.abs和abs函数

目录
  • 说在最前
  • 先看示例程序-abs()函数
  • 再看示例程序-numpy.abs()函数
  • 观察两个程序的结果
  • 分析解释
  • 拓展
  • 补充:numpy abs()报错
  • 总结

说在最前

不知道小伙伴们在写代码的时候有没有区分开numpy.abs和abs函数,别小看这两个函数,如果在写程序的时候正确区分使用这两个函数可以使自己的程序运行效率大大提升。

别看这两个函数都能对整数求绝对值,但他们俩的返回值类型完全不一样,如果傻傻地混为一谈,将会使你的程序运行时间被大大拖累!

今天笔者就带小伙伴们看看,这两个函数究竟该怎么正确使用才能使自己的程序运行效率得到提升。

先看示例程序-abs()函数

注意观察变量row和语句temp=row-1

import time

row=-1000
row=abs(row)  #这里的函数是abs()

start_time = time.time()#记录程序运行到这(记为A)的时间

for i in range(row):
    for j in range(1000):
        temp=row-1    #temp在这里只是用来接收row-1的结果

end_time = time.time()#记录程序运行到这(记为B)的时间
print(end_time-start_time)#输出A和B代码间的程序运行时间

运行时间为:0.08079314231872559

再看示例程序-numpy.abs()函数

注意观察变量row和语句temp=row-1

import numpy
import time

row=-1000
row=numpy.abs(row)   #这里的函数是numpy.abs()

start_time = time.time()#记录程序运行到这(记为A)的时间

for i in range(row):
    for j in range(1000):
        temp=row-1    #temp在这里只是用来接收row-1的结果

end_time = time.time()#记录程序运行到这(记为B)的时间
print(end_time-start_time)#输出A和B代码间的程序运行时间

运行时间为:0.20246124267578125

观察两个程序的结果

观察两个程序的相同代码段运行时间的结果,你会发现作用都是用来取整的abs()函数和numpy.abs()函数,运行时间竟然差了大约2.5倍!

小伙伴们看到这里是不是十分惊讶和不解?为什么相同的代码段运行时间竟然大不相同?虽然在本文章中,它们的相同代码段运行时间只差了0点几秒,但是在做数据处理时,庞大的数据处理足足可以使这微小的差距瞬间拉大,造成本来可以几秒钟运行结束的程序你却用了几分钟跑完的尴尬局面。

分析解释

注意观察两个程序的变量row,

第一个程序

row=abs(row)

第二个程序

row=numpy.abs(row)

小伙伴们第一眼看好像这两个函数除了外貌不同外,也没啥不同,都是对变量row取绝对值,但是这两个函数恰恰在返回值类型上不同。abs()函数返回的类型是int型而numpy.abs()函数返回的类型却是ndarray。小伙伴们可以使用Type()函数来看变量row的类型,或者去numpy的官网看一下numpy.abs()函数的说明,链接附上:numpy.abs()函数官方说明

int类型这里不做过多解释,有兴趣的小伙伴可以自己去了解相关知识。

而ndarray类型,是numpy库里的数组类型,它是numpy库里的一种类(numpy.ndarray),小伙伴们可以去官网上看看有关ndarray类型的说明。链接附上:numpy.ndarray类型官方说明

有了上面的基础,我们再来理解为什么会出现相同代码段运行时间不同就变得容易许多了。其主要原因在于

temp=row-1

这段代码。如果row变量是ndarray类型,那么ndarray类型减去int类型(常量1是int类型)就会存在不同类型间的变量进行转换的问题(这种转换是系统自己完成的,也可以称之为隐藏式地转换),这会使程序有额外的开销,使程序的运行效率降低。而如果row变量是int类型就不会出现这种问题,所以这就是使两段相同的代码运行时间不同的根本原因所在。

另外numpy.abs()函数希望的参数类型是ndarray类型,而abs()函数希望的参数类型之一是int类型,所以numpy.abs(row)和abs(row)也存在上述问题。

拓展

虽然numpy.abs()函数对单个元素(整型、浮点型等等)的处理较abs()函数慢,但如果元素很多,可以把这些元素组合起来形成一个ndarray类型数组,这时使用numpy.abs()函数(ndarray类型做实际参数)就要比用abs()函数循环处理快得多啦。

补充:numpy abs()报错

我在用numpy的abs()给数组取绝对值的时候出现了这个问题,很明显是dtype的问题

'<U32'是unsigned 32的含义,那么这个格式本来就没有符号,我还非要取绝对值那肯定会报错的呀!

回过头去看了看果然是append进数组的时候忘了把格式强转成float了

OK!转换!解决!

ufunc 'absolute' did not contain a loop with signature matching types dtype('<U32') dtype('<U32')

总结

单个元素用abs()函数

多个元素并行处理用numpy.abs()函数

使用函数和写代码时一定要注意变量隐藏式地转换,因为这能在无形之中拖慢你程序的运行速度。

到此这篇关于Python中numpy.abs和abs函数的文章就介绍到这了,更多相关Python numpy.abs和abs函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 实例讲解Python3中abs()函数

    Python3 abs() 函数 描述 abs() 函数返回数字的绝对值. 语法 以下是 abs() 方法的语法: abs( x ) 参数 x-- 数值表达式,可以是整数,浮点数,复数. 返回值 函数返回 x(数字)的绝对值,如果参数是一个复数,则返回它的大小. 实例 以下展示了使用 abs() 方法的实例: #!/usr/bin/python3 print ("abs(-40) : ", abs(-40)) print ("abs(100.10) : ", abs

  • Python中用于返回绝对值的abs()方法

    方法abs() 返回x的绝对值,-x-零之间的(正极)的距离. 语法 以下是abs()方法的语法: abs( x ) 参数 x -- 这是一个数值表达式 返回值 此方法返回x的绝对值. 例子 下面的例子显示abs()方法的使用. #!/usr/bin/python print "abs(-45) : ", abs(-45) print "abs(100.12) : ", abs(100.12) print "abs(119L) : ", abs(

  • 实例详解Python中的numpy.abs和abs函数

    目录 说在最前 先看示例程序-abs()函数 再看示例程序-numpy.abs()函数 观察两个程序的结果 分析解释 拓展 补充:numpy abs()报错 总结 说在最前 不知道小伙伴们在写代码的时候有没有区分开numpy.abs和abs函数,别小看这两个函数,如果在写程序的时候正确区分使用这两个函数可以使自己的程序运行效率大大提升. 别看这两个函数都能对整数求绝对值,但他们俩的返回值类型完全不一样,如果傻傻地混为一谈,将会使你的程序运行时间被大大拖累! 今天笔者就带小伙伴们看看,这两个函数究

  • 一文详解Python中的Map,Filter和Reduce函数

    目录 1. 引言 2. 高阶函数 3. Lambda表达式 4. Map函数 5. Filter函数 6. Reduce函数 7. 总结 1. 引言 本文重点介绍Python中的三个特殊函数Map,Filter和Reduce,以及如何使用它们进行代码编程.在开始介绍之前,我们先来理解两个简单的概念高阶函数和Lambda函数. 2. 高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 举例如下: def higher(your_function, som

  • 图文详解Python中最神秘的一个魔法函数

    目录 前言 1.有点价值的missing() 2.神出鬼没的missing() 3.被施魔法的missing() 4.小结 五.总结 前言 一个非常神秘的魔术方法. 这个方法非常不起眼,用途狭窄,我几乎从未注意过它,然而,当发现它可能是上述"定律"的唯一例外情况时,我认为值得再写一篇文章来详细审视一下它. 本文主要关注的问题有:(1) missing()到底是何方神圣?(2) missing()有什么特别之处?擅长"大变活人"魔术? (3) missing()是否真

  • 用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: from django.db import models class Province(models.Model): name = models.CharField(max_length=10) def __unicode__(self): return self.name class City(models.Model): name = models.Ch

  • 详解Python中的Numpy、SciPy、MatPlotLib安装与配置

    用Python来编写机器学习方面的代码是相当简单的,因为Python下有很多关于机器学习的库.其中下面三个库numpy,scipy,matplotlib,scikit-learn是常用组合,分别是科学计算包,科学工具集,画图工具包,机器学习工具集. numpy :主要用来做一些科学运算,主要是矩阵的运算.NumPy为Python带来了真正的多维数组功能,并且提供了丰富的函数库处理这些数组.它将常用的数学函数都进行数组化,使得这些数学函数能够直接对数组进行操作,将本来需要在Python级别进行的循

  • 详解python中GPU版本的opencv常用方法介绍

    引言 本篇是以python的视角介绍相关的函数还有自我使用中的一些问题,本想在这篇之前总结一下opencv编译的全过程,但遇到了太多坑,暂时不太想回看做过的笔记,所以这里主要总结python下GPU版本的opencv. 主要函数说明 threshold():二值化,但要指定设定阈值 blendLinear():两幅图片的线形混合 calcHist() createBoxFilter ():创建一个规范化的2D框过滤器 canny边缘检测 createGaussianFilter():创建一个Ga

  • 详解Python中matplotlib模块的绘图方式

    目录 1.matplotlib之父简介 2.matplotlib图形结构 3.matplotlib两种画绘图方法 方法一:使用matplotlib.pyplot 方法二:面向对象方法 1.matplotlib之父简介 matplotlib之父John D. Hunter已经去世,他的一生辉煌而短暂,但是他开发的的该开源库还在继续着辉煌.国内介绍的资料太少了,查阅了一番整理如下: 1968 出身于美国的田纳西州代尔斯堡. 之后求学于普林斯顿大学. 2003年发布Matplotlib 0.1版,初衷

  • 详解Python list 与 NumPy.ndarry 切片之间的对比

    详解Python list 与 NumPy.ndarry 切片之间的区别 实例代码: # list 切片返回的是不原数据,对新数据的修改不会影响原数据 In [45]: list1 = [1, 2, 3, 4, 5] In [46]: list2 = list1[:3] In [47]: list2 Out[47]: [1, 2, 3] In [49]: list2[1] = 1999 # 原数据没变 In [50]: list1 Out[50]: [1, 2, 3, 4, 5] In [51]

  • 详解python中的 is 操作符

    大家可以与Java中的 == 操作符相互印证一下,加深一下对引用和对象的理解.原问题: Python为什么直接运行和在命令行运行同样语句但结果却不同,他们的缓存机制不同吗? 其实,高票答案已经说得很详细了.我只是再补充一点而已. is 操作符是Python语言的一个内建的操作符.它的作用在于比较两个变量是否指向了同一个对象. 与 == 的区别 class A(): def __init__(self, v): self.value = v def __eq__(self, t): return

  • 详解python中的线程

    Python中创建线程有两种方式:函数或者用类来创建线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程. 类:创建threading.Thread的子类来包装一个线程对象. 1.线程的创建 1.1 通过thread类直接创建 import threading import time def foo(n): time.sleep(n) print("foo func:",n) def bar(n): time.sleep(n) prin

随机推荐