2014-10-20 2 views
1

Я использую функцию power from numpy, и я получаю предупреждающее сообщение. Это код:Runtime Warning Использование питания с помощью Numpy

import numpy as np 


def f(x, n): 
    factor = n/(1. + n) 
    exponent = 1. + (1./n) 
    f1_x = factor * np.power(0.5, exponent) - np.power(0.5 - x, exponent) 
    f2_x = factor * np.power(0.5, exponent) - np.power(x - 0.5, exponent) 
    return np.where((0 <= x) & (x <= 0.5), f1_x, f2_x) 

fv = np.vectorize(f, otypes='f') 
x = np.linspace(0., 1., 20) 
print(fv(x, 0.23)) 

И это предупреждение:

E: \ ProgramasPython3 \ LibroCientifico \ partesvectorizada.py: 8: RuntimeWarning: недопустимое значение встречается в мощности f2_x = коэффициент * np.power (0,5, показатель) - np.power (х - 0,5, показатель) Е: \ ProgramasPython3 \ LibroCientifico \ partesvectorizada.py: 7: RuntimeWarning: недействительное значение встречается в мощности f1_x = коэффициент * np.power (0,5, показатель степени) - np.power (0,5 - x, показатель степени) [-0.0199636 -0,00895462 -0,0023446 0,00136486 0,003271 0,00414007 0,00447386 0,00457215 0,00459036 0,00459162 0,00459162 0,00459036 0,00457215 0,00447386 0,00414007 0,003271 0,00136486 -0,0023446 -0,00895462 -0,0199636]

Я не знаю, что это недопустимое значение. И я не знаю, как указать это, когда функция numpy f2_x действительна только для значений между> 0,5 и < = 1.0. Thanks

+0

Он работает отлично для меня - Python 3.4.1, numpy 1.9.0, Win8 – MattDMo

ответ

2

Причина этого в том, что вы пытаетесь взять нецелую силу отрицательного числа. По-видимому, это не работает в более ранних версиях Python/Numpy, если вы явно не придаете значения сложным. Таким образом, вы должны сделать что-то вроде

np.power(complex(0.5 - x), exponent) .real

EDIT: Поскольку ваши ценности будут действительно сложными (не какой-то реальное число + некоторые крошечные емк часть), я думаю, что вы хотите либо используйте комплекс (но затем <=), позже получится довольно сложно, или вы захотите поймать случай, когда база отрицательна каким-то другим способом.

+1

+1 или вы можете просто сделать 'x = x.astype (np.complex128)' –

+0

Я уже установил numpy last, но я получить ту же ошибку, добавляя реальную. Странная вещь, я использую Windows 8.1 64 бит, и Pycharm обнаруживает меня numpy 0.8, но я уже установил последнюю версию для Python 3.4.2 64 бит. Спасибо – Tobal

+0

@Tobal вы также положили 'complex()' cast? На самом деле это важная часть. Если это не сработает, попробуйте версию @Saullo Castro. Я уверен, что отрицательный аргумент - проблема (я получаю ту же ошибку при ее попытке). – greschd

0

Хорошо, спасибо всем, вот решение, используя функцию кусочно против которой из NumPy, и используя np.complex128 как упоминалось @Saullo

import numpy as np 


    def f(x, n): 
     factor = n/(1. + n) 
     exponent = (n + 1.)/n 
     f1_x = lambda x: factor * \ 
      np.power(2., -exponent) - np.power((1. - 2. * x)/2., exponent) 
     f2_x = lambda x: factor * \ 
      np.power(2., -exponent) - np.power(-(1. - 2. * x)/2., exponent) 
     conditions = [(0. <= x) & (x <= 0.5), (0.5 < x) & (x <= 1.)] 
     functions = [f1_x, f2_x] 
     result = np.piecewise(x, conditions, functions) 
     return np.real(result) 

    x = np.linspace(0., 1., 20) 
    x = x.astype(np.complex128) 
    print(f(x, 0.23)) 

Проблема заключается в том, когда база от власти отрицательный, тогда np.power не работает нормально, и вы получаете предупреждающее сообщение. Я ожидаю, что это будет полезно для всех.