2015-06-29 4 views
2

, хотя я знаю, что есть различные вопросы, которые ищут решения для этого сообщения об ошибке. Мне еще предстоит найти ответ, который поможет мне решить мой код, чтобы заставить сравнение работать, у меня есть кодЗначение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()

def f(x,d,h,L): 
    ans=0. 
    if ((0.<=x) & (x<d)): 
     ans=h*(x/d) 
    elif ((d<=x) & (x<=L)): 
     ans=((L-x)/(L-d)) 
    return ans 

x=np.linspace(0,10,1000) 
h=5*10**(-3) 
d=16*10**(-2) 
L=64.52*10**(-2) 
func=f(x,d,h,L) 

Но когда я пытаюсь запустить его, я получаю сообщение об ошибке, указывающее на if линии с кодом ошибки в названии, я попытался предлагаемые решения, приведенные в подобных вопросах, таких как использование np.logical_and или and вместо из &, но все три дают ту же ошибку, пожалуйста, помогите мне

+0

'x' - это массив. Вы хотите, чтобы 'f' делал одно, если какой-либо/все' x' попадали в один диапазон, а другой, если они этого не делают? Или вы хотите, чтобы это делало одно с величинами 'x', которые попадали в один диапазон, и другая вещь для других значений' x'? Другими словами, тест 'if' распространяется на все« x »или на отдельные элементы? – hpaulj

+0

Другой способ поставить мой вопрос - работает ли функция правильно, если вы передаете ей элементы 'x' в отдельности? – hpaulj

ответ

4

Вы сосредоточены на объединении предложений, но это сами статьи. Вы, наверное, хотите здесь что-то вроде:

if numpy.all(0 <= x) and numpy.all(x < d): 
    ... 

Смотрите документацию для numpy.all.

+0

Возможной альтернативой является 'numpy.all ((0 <= x) & (x Evert

+0

@Evert Спасибо, хотя я действительно думаю, что версия в ответ выигрывает от короткого замыкания, в то время как этого нет, нет? –

+0

Учитывая 'x' и другие параметры, эти' all' tests возвращают 'False', что означает, что' f' просто возвращает '0.'. – hpaulj

0

Ошибка связана с тем, что массив содержит больше значения. Например, a < 0, где a = 1 имеет окончательное значение истины (false). Однако, если a - массив. например, [-1, 0, 1], некоторые элементы меньше нуля, а некоторые больше или равны нулю. Итак, какова должна быть ценность истины? Чтобы иметь возможность создавать значение истины, вы должны указать, хотите ли вы все значения, которые должны быть меньше нуля, или, по крайней мере, для одного значения меньше нуля (любое значение).

Поскольку математические операторы на Numpy массивов возвращают сами массивы, мы можем назвать all или any на этих массивах, чтобы увидеть, если все или, по крайней мере, одно значения правдивого. Вы бы переписать, если заявление, как:

if (0 <= x).all() and (x < d).all(): 
    ... 
# alternatively 
if 0 <= x.min() and x.max() < d: 
    ... 
0

Другие ответили при условии, что вы хотите применить один расчет или другие в зависимости от/любых значений x, соответствуют ли всем соответствующим условиям. Я сделаю другое предположение - вы хотите применить f к каждому элементу x отдельно.

Applied поэлементно я получаю:

In [226]: x=np.linspace(0,1,20) 

In [227]: [f(z,d,h,L) for z in x] 
Out[227]: 
[0.0, 
0.0016447368421052631, 
0.0032894736842105261, 
0.0049342105263157892, 
0.89586497157981526, 
0.78739098364212268, 
0.6789169957044302, 
0.57044300776673762, 
0.46196901982904509, 
0.35349503189135251, 
0.24502104395365998, 
0.13654705601596731, 
0.028073068078274897, 
0.0, 
0.0, 
0.0, 
0.0, 
0.0, 
0.0, 
0.0] 

векторизованного эквивалент:

In [238]: I = (0<=x) & (x<d) 
In [239]: J=(d<=x) & (x<=L) 

In [240]: out=np.zeros_like(x) 
In [241]: out[I]=h*(x[I]/d) 
In [242]: out[J]=(L-x[J])/(L-d) 

In [243]: out 
Out[243]: 
array([ 0.  , 0.00164474, 0.00328947, 0.00493421, 0.89586497, 
     0.78739098, 0.678917 , 0.57044301, 0.46196902, 0.35349503, 
     0.24502104, 0.13654706, 0.02807307, 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ]) 

Я дам вам пакет, что в качестве функции.


С параметрами, заданными (включая полный x), np.all(I) и np.all(J) оба False, то есть f вернется 0.0, если применяется к x в целом.


def f(x, d, h, L): 
    I = (0<=x) & (x<d) 
    J=(d<=x) & (x<=L) 
    out=np.zeros_like(x) 
    out[I]=h*(x[I]/d) 
    out[J]=(L-x[J])/(L-d) 
    return out 
+0

Привет. однако, ваш ответ больше похож на то, что я ищу, как я могу сделать это функцией 'x'? Я пытаюсь сделать график * x vs. y *, который должен выглядеть как треугольник с левой стороной круче, чем правый, высота * h *, расстояние от нуля до * L *, а d - расстояние вдоль * x * до точки, где * y = h * – JuanGiraldo

+0

Я добавил версию функции. – hpaulj

5

Использование numpy.where. При желании используйте экспоненциальную нотацию для чисел с плавающей запятой.

import numpy as np 

def f(x, d, h, L): 
    return np.where(x < d, h*(x/d), (L - x)/(L - d)) 

x = np.linspace(0,10,1000) 
h = 5e-3 
d = 16e-2 
L = 64.52e-2 

func = f(x, d, h, L) 
1

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

def f(a,d,h,L): 
ans2=[] 
for i in range(1000): 
    if (0.<=a[i]) & (a[i]<d): 
     ans=x[i]*(h/d) 
     ans2.append(ans) 
    elif ((d<=a[i]) & (a[i]<=L)): 
     ans=h*((L-a[i])/(L-d)) 
     ans2.append(ans) 
return ans2 
L=64.52*10**(-2) 
x=np.linspace(0,L,1000) 
h=5*10**(-3) 
d=16*10**(-2) 
plot.plot(x,f(x,d,h,L)) 

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

0
def f(x,d,h,L): 
    ans=0. 
    if ((0.<=x) & (x<d)): 
     ans=h*(x/d) 
    elif ((d<=x) & (x<=L)): 
     ans=((L-x)/(L-d)) 
    return ans 

#A ajouter 
f_vec = numpy.vectorize(f) 
#et c'est tout^^ 

x=np.linspace(0,10,1000) 
h=5*10**(-3) 
d=16*10**(-2) 
L=64.52*10**(-2) 
func=f_vec(x,d,h,L) #ici il faut tout de même ajouter _vec 
Смежные вопросы

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