Нормализация Numpy Arrange

Я только начинаю программировать на питоне. Я хотел бы нормализовать набор 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))

Я все еще могу «ввести» свою функцию нормализации, о чем свидетельствуют мои многочисленные операторы печати. Я пробовал экспериментировать с разными способами написания строки, которая выдает сообщение об ошибке, но безуспешно. Любая помощь будет оценена по достоинству. Возможно, мне нужно переписать мою функцию нормализации, чтобы я мог правильно использовать quad? Кроме того, если есть более простой способ нормализации функций в python для моего конкретного случая, сообщите мне.


person Erdrick    schedule 28.06.2015    source источник
comment
Обратите внимание, что numpy arange не соответствует нецелочисленным размерам шага. Документация рекомендует вместо этого linspace.   -  person makunha    schedule 17.05.2018


Ответы (1)


В документации для quad указано :

func : function Функция или метод Python для интеграции.

Однако первый аргумент, который вы передаете, — это 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
person Ami Tavory    schedule 28.06.2015