Как можно выполнять операции только при определенных условиях для отдельных значений при вводе массива numpy в функцию? - PullRequest
0 голосов
/ 21 февраля 2020

Я строю функцию в диапазоне значений, поэтому, естественно, я добавил numpy .arange () в функцию, чтобы получить зависимые значения для графика. Тем не менее, некоторые значения собираются в NaN или бесконечность. Я знаю, почему это происходит, поэтому я вернулся к функции и включил некоторые условные выражения. Если бы они работали, они заменили бы значения, приводящие к выходам NaN, только когда условия выполнены. Однако, исходя из ошибок, которые я получаю, кажется, что операции выполняются для каждой записи во входах, а не только при выполнении этих условий.

Мой код выглядит следующим образом

import matplotlib.pyplot as plt
import numpy as np
import math

k=10
l=50
pForPlot = np.arange(0,1,0.01)

def ProbThingHappens(p,k,l):
    temp1 = (((1-p)**(k-1)*((k-1)*p+1))**l)
    temp2 = (((1-p)**(1-k))/((k-1)*p+1))
    if float(temp2) <= 1.0*10^-300:
        temp2 = 0
    print("Temp1 = " + str(temp1))
    print("Temp2 = " + str(temp2))
    temp = temp1*(temp2**l-1)
    if math.isnan(temp):
        temp = 1
    print("Temp = " + str(temp))
    return temp

plt.plot(pForPlot,ProbThingHappens(pForPlot,k,l))
plt.axis([0,1,0,1])
plt.xlabel("p")
plt.ylabel("Probability of thing happening")
plt.rcParams["figure.figsize"] = (20,20)
plt.rcParams["font.size"] = (20) 
plt.show()

И ошибка, которую он возвращает:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-e707ad24af01> in <module>
     20     return temp
     21 
---> 22 plt.plot(pForPlot,ProbAnyOverlapsAtAll(pForPlot,k,l))
     23 plt.axis([0,1,0,0.01])
     24 plt.xlabel("p")

<ipython-input-20-e707ad24af01> in ProbAnyOverlapsAtAll(p, k, l)
     10     temp1 = (((1-p)**(k-1)*((k-1)*p+1))**l)
     11     temp2 = (((1-p)**(1-k))/((k-1)*p+1))
---> 12     if float(temp2) <= 1.0*10^-300:
     13         temp2 = 0
     14     print("Temp1 = " + str(temp1))

TypeError: only size-1 arrays can be converted to Python scalars

Как указать в функции, над которой я хочу работать только точные c значения, а не весь производимый массив значений? Я предполагаю, что если я знаю, как заставить float () выбрать только одно значение, то это будет просто сделать то же самое для других условий. Мне ужасно жаль, если этот вопрос задавался раньше, но я искал ответы, используя все возможные выражения. Я боюсь, что в этом случае я просто не знаю, знаю правильную терминологию. Любая помощь будет принята с благодарностью.

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