GVKun编程网logo

有效地检测python中的符号变化(有效地检测python中的符号变化的方法)

4

对于有效地检测python中的符号变化感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解有效地检测python中的符号变化的方法,并且为您提供关于Python-计算符号变化、python中的@

对于有效地检测python中的符号变化感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解有效地检测python中的符号变化的方法,并且为您提供关于Python-计算符号变化、python中的@符号、Python中的符号表、Python圈中的符号计算库-Sympy的宝贵知识。

本文目录一览:

有效地检测python中的符号变化(有效地检测python中的符号变化的方法)

有效地检测python中的符号变化(有效地检测python中的符号变化的方法)

我想做的正是这个家伙所做的:

Python-计算符号变化

但是,我需要对其进行优化以使其超快运行。简而言之,我想采用一个时间序列,并告诉它每次穿越时都越过零(更改符号)。我想记录两次过零之间的时间。由于这是真实数据(32位浮点数),我怀疑我每个人都有一个正好为零的数字,所以这并不重要。我目前有一个计时程序,所以我将为您的成绩计时,以查看谁获胜。

我的解决方案给出了(微秒):

open data       8384sign data       8123zcd data        415466

如您所见,过零检测器是最慢的部分。这是我的代码。

import numpy, datetimeclass timer():    def __init__(self):        self.t0 = datetime.datetime.now()        self.t = datetime.datetime.now()    def __call__(self,text=''unknown''):        print text,''\t'',(datetime.datetime.now()-self.t).microseconds        self.t=datetime.datetime.now()def zcd(data,t):    sign_array=numpy.sign(data)    t(''sign data'')    out=[]    current = sign_array[0]    count=0    for i in sign_array[1:]:        if i!=current:            out.append(count)            current=i            count=0        else: count+=1    t(''zcd data'')    return outdef main():    t = timer()    data = numpy.fromfile(''deci.dat'',dtype=numpy.float32)    t(''open data'')    zcd(data,t)if __name__==''__main__'':    main()

答案1

小编典典

关于什么:

import numpya = [1, 2, 1, 1, -3, -4, 7, 8, 9, 10, -2, 1, -3, 5, 6, 7, -10]zero_crossings = numpy.where(numpy.diff(numpy.sign(a)))[0]

输出:

> zero_crossingsarray([ 3,  5,  9, 10, 11, 12, 15])

即,zero_crossings将包含 之前 发生零交叉的元素的索引。如果要在 之后 的元素,只需将1添加到该数组。

Python-计算符号变化

Python-计算符号变化

我有从左到右阅读的数字列表。每当我在阅读要计数的序列时遇到符号变化时。

X = [-3,2,7,-4,1,-1,6,-2,1] 
X = [-,+,-,+]

因此,此列表中有8个符号更改。

如果Item [0](在这种情况下为-3)为负,则视为符号更改。同样,列表中的任何0都将被考虑[-]

任何帮助将不胜感激。

python中的@符号

python中的@符号

示例1

def minus(f):

print ''minus''
f()
 
def plus(f):
print ''plus''
f()


def test(a):
if a > 3 : return plus
else : return minus

@test(5)
def xxx():
print ''ok''

解释器首先会解释@符号后面的代码,如果如上面的代码类似,那么test(5)将被执行,因为test参数5大于3,所以会返回一个函数指针plus(可以用C的这个名字来理解),plus将下一行的函数指针xxx当作参数传入,直到执行完成。最后结果将输出‘plus’和‘ok’。 有时候可能是下面这种形式:


示例2

def minus(f):
print ''minus''
f()

@minus
def xxx():
print ''ok''


minus因为本身已经是一个函数指针,所以会直接以xxx作为参数传入,结果会输出‘minus’和‘ok’。


示例3

def f1(arg):
    print "f1"
    rl = arg()
    print rl
    return rl + "f1"
    
@f1
def f2(s = ""):
    print "f2"
    return s + "f2r"


print "start"

Python中的符号表

Python中的符号表

我们如何看到python源代码的符号表?

我的意思是,Python在实际运行每个程序之前都会为其创建一个符号表。所以我的问题是如何获取该符号表作为输出?

答案1

小编典典

如果您询问生成字节码时使用的符号表,请看一下symtable模块。此外,Eli
Bendersky撰写的这两篇文章非常有趣,而且非常详细:

Python内部构件:符号表,第1部分

Python内部构件:符号表,第2部分

在第2部分中,他详细介绍了一个可以打印出symtable描述的函数,但是它似乎是为Python 3编写的。这是Python 2.x的一个版本:

def describe_symtable(st, recursive=True, indent=0):    def print_d(s, *args):            prefix = '' '' *indent            print prefix + s + '' '' + '' ''.join(args)    print_d(''Symtable: type=%s, id=%s, name=%s'' % (            st.get_type(), st.get_id(), st.get_name()))    print_d(''  nested:'', str(st.is_nested()))    print_d(''  has children:'', str(st.has_children()))    print_d(''  identifiers:'', str(list(st.get_identifiers())))    if recursive:            for child_st in st.get_children():                    describe_symtable(child_st, recursive, indent + 5)

Python圈中的符号计算库-Sympy

Python圈中的符号计算库-Sympy

Python圈中的符号计算库-Sympy

import math
math.sqrt(8)
2.8284271247461903

我们知道,

Python圈中的符号计算库-Sympy

那么我们看看Python中结果


math.sqrt(8).math.sqrt(8)
8.000000000000002

本以为会得到8.0,但没想到得到8.000000000000002。

一、为什么会这样?
简单的说Python对给定的一个有限位数的数字进行计算,python认为

Python圈中的符号计算库-Sympy

那么

Python圈中的符号计算库-Sympy
此外

经历过高中数学的朋友们估计会很熟悉下面这样的表达

Python圈中的符号计算库-Sympy

而不是

Python圈中的符号计算库-Sympy

如果我们平常计算的任务常常有类似于上面的例子这样的表达式,那么直接用python计算其结果只是真实值的逼近。如果这样的计算很大很多,误差会逐渐积累,这是我们不能忍受的,所以这时候就需要Python能处理

Python圈中的符号计算库-Sympy

这种数学符号计算。

二、什么是数学符号计算?
数学符号计算能处理表征数字的符号计算。这意味着数学对象被精确地表示,而不是近似地表示,而具有未被计算的变量的数学表达式被留在符号形式中。

sympy库简介
SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系统。它保证自身的代码尽可能的简单,且易于理解,容易扩展。SymPy完全由Python写成,不需要额外的库。

sympy的表达式与我们平常的手写的数学表达式略微有所区别,下面是sympy的方程表示符号

  • 加号 +

  • 减号 -

  • 除号 /

  • 乘号 *

  • 等号 Eq()

  • 指数 **

  • 对数 log()

  • e的指数次幂 exp()

上面的例子我们用Python实现一下。


import sympy
sympy.sqrt(8)
2*sqrt(2)

用sympy计算

Python圈中的符号计算库-Sympy


sympy.sqrt(8)*sympy.sqrt(8)
8

三、 简单学一下sysmpy中的几个实例

  • 定义数学符号(类似于数学中的变量)

  • 展开与折叠

  • 简化表达式

  • 解方程

  • 赋值计算

  • log计算

  • 导数

  • 积分

  • 求极限

3.1 定义数学符号
让我们定义一个符号表达式代表数学表达式 x+2y。首先我们要注意到python中的变量必须赋值才能使用,所以无法表达该数学表达式。所以这里一定要引入特殊的符号,这里有两种方法

#方法一
from sympy import symbols
x,y = symbols(''x y'')
expr = x + 2*y
expr
x + 2*y
#方法二from sympy.abc import x,y
expr2 = x + 2*y
expr2
x + 2*y

当数学表达式中的变量不是x,y这种单一字符,而是result这种多个字符长度的变量时,只能用方法一。

3.2 展开与折叠
Python圈中的符号计算库-Sympy


from sympy import expand,factor
from sympy.abc import x,y

expr = x**2+x*y+3*x
expr
x**2 + x*y + 3*x
#折叠
factor(expr)
x**2 + x*y + 3*x
#展开
expr2 = x*(x+y+3)
expand(expr2)
x**2 + x*y + 3*x

3.3 简化表达式
有时候我们需要简化表达式,如

Python圈中的符号计算库-Sympy


#普通的化简
from sympy import simplify
from sympy.abc import x
simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
#三角化简trigsimp
from sympy import trigsimp,sin,cos
from sympy.abc import x,y
y = sin(x)/cos(x)

trigsimp(y)
tan(x)

指数化简

Python圈中的符号计算库-Sympy


from sympy import powsimp
from sympy.abc import x,a,b
y = x**a * x**b
y
x**a*x**b
#指数化简
powsimp(y)
x**(a + b)

3.4 解方程

Python圈中的符号计算库-Sympy
注意在python中=是赋值的意思,==虽然表示等于,但是会有很大的问题。在sympy中,我们使用Eq(x,y)表示等于x=y


from sympy.abc import x,y
from sympy import solve,linsolve,Eq

#对一个方程求解,使用solve
solve(Eq(2*x-1,3), x)
[2]

注意,当我们对多个方程求解时,我们习惯把等式设定为等于0.即将等式右边的内容移动到左边。

Python圈中的符号计算库-Sympy

这时候我们再使用linsolve([方程1,方程2,...],(变量1,变量2,...))


#对多个方程求解,使用linsolve。方程的解为x=-1,y=3
linsolve([x+2*y-5,2*x+y-1], (x,y))
{(-1, 3)}

3.5 赋值计算

Python圈中的符号计算库-Sympy


from sympy.abc import x,y
from sympy import sin,cos
y = sin(x)+cos(x)y
sin(x) + cos(x)

Python圈中的符号计算库-Sympy


y.subs(x, x**2)
sin(x**2) + cos(x**2)

这里的赋值,不仅可以实现变量的替换,还可以赋与数字,进行计算。

Python圈中的符号计算库-Sympy


y.subs(x, 0)
1

3.6 log运算
Python圈中的符号计算库-Sympy


from sympy import log,expand_log
from sympy.abc import x,y,e

#expand_log为展开log,但需要将force=True,展开才能发生

expand_log(log(x**3), force=True)
3*log(x)
#expand_log为展开log,但需要将force=True,展开才能发生

expand_log(log(x**3))
log(x**3)
expand_log(log(e**x), force=True)
x*log(e)

3.7 导数
如果经历过考研求导数,大家都应该都还记得这些吧。

Python圈中的符号计算库-Sympy


from sympy import diff,sin,cos
from sympy.abc import x,y,z,f

#对sin(x)求导
diff(sin(x))
cos(x)
diff(cos(x))
-sin(x)

偏导

Python圈中的符号计算库-Sympy


#求偏导
f = 3*x**2*y*z
diff(f, x,y)
6*x*z

3.8 积分
Python圈中的符号计算库-Sympy


from sympy.abc import pi,x
from sympy import integrate,sin

integrate(sin(x), (x,0,pi))
-cos(pi) + 1

3.9 极限

Python圈中的符号计算库-Sympy


from sympy.abc import x
from sympy import limit
limit(1/x, x, 0, ''+'')
oo

3.10 展开式

Python圈中的符号计算库-Sympy


from sympy import exp,symbols

x = symbols(''x'')

expr = exp(x)

expr.series(x, 0, 3)
1 + x + x**2/2 + O(x**3)

关于有效地检测python中的符号变化有效地检测python中的符号变化的方法的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Python-计算符号变化、python中的@符号、Python中的符号表、Python圈中的符号计算库-Sympy等相关知识的信息别忘了在本站进行查找喔。

本文标签: