Как мы можем построить несколько строк функции с l для 1000 *, чтобы минимизировать кодирование? - PullRequest
0 голосов
/ 20 января 2020
def k(x,b):
    return x**b

x = np.linspace(0,10,100)

L = k(x,1)
plt.plot(x,L, label = 'n=1')


L2 = k(x,2)
plt.plot(x,L2, label = 'n=2')

plt.show()

Я пытаюсь построить несколько многочленов x^b.

Я могу построить функцию для различных значений b, но мне нужно сделать код более эффективным, используя для l oop, или хороший способ изменить значение b и затем построить их на одном графике.

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Проверьте документы plot. Я считаю, что y (2-й аргумент) может иметь форму (n, m), где n соответствует размеру x, а m количество линий, которые вы хотите нарисовать:

In [156]: x = np.linspace(0,10,11) 
In [160]: y = x[:,None]**np.array([1,2,3])                                                       
In [161]: y                                                                                      
Out[161]: 
array([[   0.,    0.,    0.],
       [   1.,    1.,    1.],
       [   2.,    4.,    8.],
       [   3.,    9.,   27.],
       [   4.,   16.,   64.],
       [   5.,   25.,  125.],
       [   6.,   36.,  216.],
       [   7.,   49.,  343.],
       [   8.,   64.,  512.],
       [   9.,   81.,  729.],
       [  10.,  100., 1000.]])
In [162]: plt.plot(x, y)                                                                         
Out[162]: 
[<matplotlib.lines.Line2D at 0x7ff738082940>,
 <matplotlib.lines.Line2D at 0x7ff738082a90>,
 <matplotlib.lines.Line2D at 0x7ff738082be0>]

Проверьте plot документы о том, как предоставлять метки для нескольких строк.

При расчете y используется numpy broadcasting, что позволяет нам работать с 2 1d массивами, создавая новый 2d массив.

0 голосов
/ 20 января 2020

Я могу построить функцию для различных значений b, но мне нужно сделать код более эффективным, используя a для l oop или хороший метод, чтобы изменить значение b и затем отобразить их в одном графике.

A l oop не сделает ваш код более эффективным. По определению:

ef · fi ·ient

(особенно системы или машины), достигая максимальной производительности с минимальными затратами усилий или затрат

A Я oop вместе с вашими обертками потратил впустую усилия. Это делает ваш код намного сложнее для чтения, обслуживания, а также более дорогим для вычислений, поскольку требует больше кадров для инициализации Как указано в Дзен Python:

Простое лучше, чем сложное.

Нет абсолютно никаких причин, почему вы не должны просто написать:

x = np.linspace(0,10,100)
plt.plot(x, x**1, label='n=1')
plt.plot(x, x**2, label='n=2')

plt.show()
0 голосов
/ 20 января 2020

Вы можете сделать это следующим образом:

def k(x,b):
    return x**b

x = np.linspace(0,10,100)
for n in range(1, 3):
    L = k(x,n)
    plt.plot(x,L, label = f'n={n}')

# To add the legend:
plt.legend()
plt.show()

Resulting figure

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...