2016-04-22 3 views
2

У меня есть функцияКак построить функцию, определенную с def?

np.sin(x/2.) * np.exp(x/4.) + 6. * np.exp(-x/4.) 

и я могу построить его, используя следующий код:

x = np.arange(-5, 15, 2) 
y = np.sin(x/2.) * np.exp(x/4.) + 6. * np.exp(-x/4.) 
plt.plot(x, y) 
plt.show() 

но если я определяю функцию зарисовки не работает:

rr = np.arange(-5, 15, 2) 

def y(o): 
    return np.sin(o/2.) * np.exp(o/4.) + 6. * np.exp(-o/4.) 

def h(b): 
    return int(y(b)) 

plt.plot(rr, h) 
plt.show() 

Почему это произойдет, и как я могу изменить код для построения функции?

ответ

2

Попробуйте вместо этого:

import numpy as np 
import matplotlib.pyplot as plt 

rr = np.arange(-5, 15, 2) 

def y(o): 
    return np.sin(o/2.) * np.exp(o/4.) + 6. * np.exp(-o/4.) 

plt.plot(rr, y(rr).astype(np.int)) 
plt.show() 
1

Ответ от хуннов держит хорошо.

Однако, если вы очень специфичны на использовании двух определений функций, то попробуйте следующее:

def y(o): 
    return np.sin(o/2.) * np.exp(o/4.) + 6. * np.exp(-o/4.) 
def h(b): 
    l = [] 
    for i in b: 
     l.append(int(y(i))) 
    return l 
rr = np.arange(-5, 15, 2) 
plt.plot(rr, h(rr)) 
plt.show() 

Для ответа на то, почему ваш код не работает, когда вы назвали функцию «з», вы не сделали передать любой параметр, следовательно, это возвращает определение функции или указатель местоположения памяти функции. Даже если вы прошли rr до h, h не обрабатывался, чтобы преобразовать его в итерируемый.

+0

Если вы действительно хотите создать дополнительную функцию для передачи данных в 'int', вы можете просто заменить содержимое' h (b) 'на' return y (b) .astype (np.int) '. И если вы действительно (по какой-либо причине) хотели бы сохранить цикл, это намного быстрее, если вы сначала определяете весь массив как «l = np.zeros_like (b, dtype = np.int)»; для большого размера 'b', создающего пустой список, и добавляемые значения будут намного медленнее (но на самом деле цикл здесь не нужен: используйте силу' numpy' и его операции над массивами!) – Bart

Смежные вопросы