规范化一个 Numpy 排列
Normalizing A Numpy Arange
我刚开始在 python 中编程。我想为各种功能标准化一个 numpy arange。到目前为止我的代码是
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))
我仍然能够 "enter" 我的规范化函数,正如我的多个打印语句所证明的那样。我曾尝试用不同的方式来编写给出错误消息的行,但没有任何运气。任何帮助,将不胜感激。也许我需要重写我的规范化函数,以便我可以正确使用四边形?另外,如果针对我的特殊情况,python 中有更简单的函数标准化方法,请告诉我。
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
您还可以构建一个元函数,它接受一个函数和 returns 一个对其结果进行规范化的函数:
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 arange。到目前为止我的代码是
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))
我仍然能够 "enter" 我的规范化函数,正如我的多个打印语句所证明的那样。我曾尝试用不同的方式来编写给出错误消息的行,但没有任何运气。任何帮助,将不胜感激。也许我需要重写我的规范化函数,以便我可以正确使用四边形?另外,如果针对我的特殊情况,python 中有更简单的函数标准化方法,请告诉我。
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
您还可以构建一个元函数,它接受一个函数和 returns 一个对其结果进行规范化的函数:
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