2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 [Python] Использование методов all и аny
Сообщение15.03.2016, 17:09 


14/02/16
20
Здравствуйте. В python (X,Y) пытаюсь построить график при помощи matplotlib.
Код:
import matplotlib.pyplot as plt
from math import *
from numpy import *
def X(t):
   gm1 = -0.006534391013910179
   gm2 = -0.2754656089860898
   cstar=10
   ts = 80
   k = 0.05
   if 0<=t<=ts:
      return e**(gm1*t)/gm1**2-(t/gm1+1//gm1**2)
   elif t> ts:
      X1 = (k/cstar)*(e**(gm1*ts)/gm1**2)-(ts/gm1+1/gm1**2)
      X2 = (k*ts/cstar)*(e**(gm1*(t-ts))-1)
      return X1 + X2
   else:
      return 0
t = linspace(0,100,10)
y = X(t)
plt.plot(t,y)
plt.savefig('X_15.03.2016.png')

При вызове python получаю следующее:
Код:
Traceback (most recent call last):
  File "adv_pr.py", line 19, in <module>
    y = X(t)
  File "adv_pr.py", line 10, in X
    if 0<=t<=ts:
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()

Понимаю, что мне предлагают использовать методы a.all() или a.any(), но как?
Новой переменной присвоить результат сравнения и использовать на ней один из этих методов?

 Профиль  
                  
 
 Re: построение графика при помощи matplotlib
Сообщение16.03.2016, 15:46 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Вы ведь понимаете смысл предупреждения «The truth value of an array with more than one element is ambiguous»? Это значит, что результат сравнения всего массива с True неоднозначен и неопределим. Вам предлагается изменить эту операцию таким образом, чтобы сравнение стало разрешимым и однозначным. Вместо неопределимого «сравнения всего массива с True» мы можем сравнить с истиной каждый из его элементов и:
а) либо сказать, что результат равен True, если равно True хотя бы одно из сравнений (это a.any(), логическое ИЛИ)
б) либо сказать, что результат равен True, если все сравнения элементов массива выдают True (это a.all(), логическое И).
Надеюсь, это объяснение было не слишком сумбурным.

 Профиль  
                  
 
 Re: построение графика при помощи matplotlib
Сообщение16.03.2016, 16:48 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Кстати, эти два метода — не единственные, какие можно придумать.

 Профиль  
                  
 
 Re: [Python] Использование методов all и аny
Сообщение23.03.2016, 23:34 
Заслуженный участник


31/12/05
1480
Проблема в том, что функция ожидает одно значение аргумента, а к ней обращаются с целым массивом, надеясь, что она векторизована. Есть два способа исправить ситуацию. Первый - плохой, тупо сделать
Код:
y=map(X,t)

Второй - хороший, векторизовать функцию, например:
Код:
   return piecewise(t, [0<=t<=ts,t>ts],
                    [lambda t: e**(gm1*t)/gm1**2-(t/gm1+1//gm1**2),
                     lambda t: (k/cstar)*(e**(gm1*ts)/gm1**2)-(ts/gm1+1/gm1**2) +
                               (k*ts/cstar)*(e**(gm1*(t-ts))-1)])

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group