Постройте минимум два массива

#python #numpy #matplotlib

Вопрос:

У меня есть два массива для значений x и два соответствующих массива для значений y, которые я хочу построить.

 import numpy as np import matplotlib.pyplot as plt  x1 = np.linspace(-2,2,100) x2 = np.linspace(0,4,100)  y1 = x1**2 1 y2 = (x2-1.5)**2  plt.plot(x1,y1) plt.plot(x2,y2) plt.show()  

Это приводит к следующему сюжету.

введите описание изображения здесь

Но вместо этого я хочу построить только минимумы этих двух кривых, т. Е. Только область y1, где y1lt;y2, и только область y2, где y2 Что-то вроде этого.

введите описание изображения здесь

Поскольку x1 и x2 разные, я не могу использовать np.minimum(). Есть ли эффективный способ сделать это с помощью numpy и/или matplotlib?

Я хотел бы иметь общий подход, который также работает, когда y1 и y2 определяются не из какой-либо известной мне функции, а взяты, например, из набора данных.

Комментарии:

1. Итак, вам нужна какая-то штучная функция, например ? y1 for xlt;0.5 else y2 Вы пишете, что хотите построить минимумы обеих функций, но это не то, что вы строите ?

Ответ №1:

Вы можете интерполировать обе функции на общий x, а затем взять их минимум.

 import numpy as np import matplotlib.pyplot as plt  x1 = np.linspace(-2, 2, 100) x2 = np.linspace(0, 4, 100)  y1 = x1 ** 2   1 y2 = (x2 - 1.5) ** 2  plt.plot(x1, y1, ls=':') plt.plot(x2, y2, ls=':') xc = np.sort(np.concatenate([x1, x2])) y1c = np.interp(xc, x1, y1, left=y2.max(), right=y2.max()) y2c = np.interp(xc, x2, y2, left=y1.max(), right=y1.max())  plt.plot(xc, np.minimum(y1c, y2c), lw=10, alpha=0.4) plt.show()  

выполнение как минимум двух функций

Ответ №2:

Одним из решений является перекрестное вычисление функций с помощью других xs и маски:

 import numpy as np import matplotlib.pyplot as plt  x1 = np.linspace(-2,2,100) x2 = np.linspace(0,4,100)  y1 = x1**2 1 y1b = x2**2 1  y2 = (x2-1.5)**2 y2b = (x1-1.5)**2  plt.plot(x1, np.where(y1lt;y2b, y1, np.nan)) plt.plot(x2, np.where(y2lt;y1b, y2, np.nan)) plt.show()  

выход:

поштучная функция

Комментарии:

1. Это работает в данном конкретном случае, но мне также нужно более общее решение; оно работает, когда я сам не определяю y1 и y2 с помощью известной функции, а вместо этого извлекаю их из набора данных.

2. @Тот, кого я вижу, вы должны были упомянуть об этом, я бы предложил другой подход 😉