python - 规范化 Numpy 范围

标签 python numpy scipy normalize

我刚刚开始用 python 编程。我想规范化各种函数的 numpy 范围。到目前为止我的代码是

from numpy import arange
from scipy.integrate import quad
import matplotlib.pyplot as plt

def function_A(x):
    return -(x-1)*(x-5)

def normalize(functionName, numpyRange):
    print "Inside normalize"

    min = numpyRange.min()
    max = numpyRange.max()

    print "functionName: ", functionName
    print "min: ", min
    print "max: ", max
    print "quad(functionName, min, max)[0]: ", quad(functionName, min, max)[0]
    print "functionName(numpyRange): ", functionName(numpyRange) 

    print "RIGHT BEFORE RETURN"

    return functionName(numpyRange) / quad(functionName, min, max)[0]

x = arange(1,5.01,0.01)
plt.plot(x, normalize(function_A, x))
plt.show()

print "This should equal unity: ", quad(normalize(function_A, x), x.min(), x.max(), args=(function_A, x))

运行代码时的错误消息是:

Traceback (most recent call last):
  File "forStackExchange3.py", line 33, in <module>
    print "This should equal unity: ", quad(normalize(function_A, x), x.min(), x.max(), args=(function_A, x))
  File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 247, in quad
    retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
  File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 312, in _quad
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
quadpack.error: First argument must be a callable function.

错误消息让我感到困惑,因为即使错误发生在线路上

print "This should equal unity: ", quad(normalize(function_A, x), x.min(), x.max(), args=(function_A, x))

我仍然能够“输入”我的规范化函数,正如我的多个打印语句所证明的那样。我尝试过用不同的方式来编写给出错误消息的行,但没有任何运气。任何帮助,将不胜感激。也许我需要重写我的标准化函数,以便我可以正确使用四边形?另外,如果有一个更简单的方法可以针对我的特定情况在 python 中规范化函数,请告诉我。

最佳答案

documentation for quad状态:

func : function A Python function or method to integrate.

但是,您传递的第一个参数是一个不可调用的ndarray。换句话说,您传递的不是要集成的函数,而是其他此类操作的结果。


这是因为技术上的错误。至于如何解决它,我必须说我不确定你在问什么。给定一个范围y,可以对其进行标准化。范围y可能是将某些函数应用于x的结果,但这不是重点。因此,您可以构建一个范围标准化器,并将其应用于函数的结果。

def function_A(x):
    return -(x-1)*(x-5)

x = arange(1,5.01,0.01)

def normalize(y):
    return y / sum(y)

>> sum(normalize(function_A(x)))
1.0

您还可以构建一个元函数,它接受一个函数并返回一个标准化其结果的函数:

def make_normalized(fn):
    return lambda x: fn(x) / sum(fn(x))

因此,您可以定义

normalized_function_A = make_normalized(function_A)

只是为了验证:

>> sum(normalized_function_A(x))
1.0

关于python - 规范化 Numpy 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104619/

相关文章:

python - 如何在 TensorFlow 中操作符号张量

Python - 向量化滑动窗口

python - 如何在 NetworkX 中加载 .mtx 文件?

python - 用 pandas 连接字符串中每个单词的前 N ​​个字符

python - 在 Python 中评估极坐标网格上的插值函数的最快方法是什么?

python - 单行/动态简单更新字符串

python - 将较小的数组放入大数组中,同时忽略零

python - python(scipy)曲线拟合的奇怪结果

python - 在用 Python 编写的基于代理的模型中使用 __slots__

python - 合并3个同名数据库,并在python中重命名它们