2015-03-25 4 views
0

Я в настоящее время обучение SciPy, и я хочу играть немного с pylab и matplotlib так как упражнение, я пытался представить себе Reddit «s hotfunction.SciPy условные функции

Конечно, этот код не работает, и я не могу понять, как Google, что я хочу.

from pylab import * 
import numpy as np 

def f(t,v): 
    y = lambda a : 1 if a > 0 else (-1 if a < 0 else 0) 

    z = lambda a : log10(abs(a)) if abs(a) >= 1 else log10(1) 

    return map(z,v)*map(y,v) + t 

n = 256 
x = np.linspace(0,100,n) 
y = np.linspace(-50,+50,n) 
X,Y = np.meshgrid(x,y) 

contourf(X, Y, f(X,Y), 15, alpha=.75, cmap='jet') 
C = contour(X, Y, f(X,Y), 15, colors='black', linewidth=.5) 
show() 

EDIT: К не работает это означает, что она дает мне следующее сообщение об ошибке:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-33-a1d2f439ebda> in <module>() 
    13 X,Y = np.meshgrid(x,y) 
    14 
---> 15 contourf(X, Y, f(X,Y), 15, alpha=.75, cmap='jet') 
    16 C = contour(X, Y, f(X,Y), 15, colors='black', linewidth=.5) 
    17 show() 

<ipython-input-33-a1d2f439ebda> in f(t, v) 
     6  z = lambda a : log10(abs(a)) if abs(a) >= 1 else log10(1) 
     7 
----> 8  return map(z,v)*map(y,v) + t 
     9 
    10 n = 256 

<ipython-input-33-a1d2f439ebda> in <lambda>(a) 
     4  y = lambda a : 1 if a > 0 else (-1 if a < 0 else 0) 
     5 
----> 6  z = lambda a : log10(abs(a)) if abs(a) >= 1 else log10(1) 
     7 
     8  return map(z,v)*map(y,v) + t 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

Не знаю, какая функция работает, как выглядит «не работает», какая работа выглядит или какой у вас вопрос. Голосование закрывается. – duffymo

+0

Я отредактировал сообщение и показал, что не работает. – FearUs

+1

Это значение важно: «ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()« – duffymo

ответ

2

Погрешность составляет от if a > 0, так как ошибка говорит значение истинности a, который будет массив NumPy неоднозначным.

Почему a массив NumPy, а не одну запись? Питона map не перебирать каждый элемент массива, он будет перебирать только в одном измерении и ваш вклад многомерна:

>>> a = np.arange(12).reshape(3, 4) 
>>> a 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
>>> f = lambda x : x 
>>> map(f, a) 
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])] 

Вы могли использовать np.vectorize вместо map, который будет работать, как вы хотите, но вы действительно должны использовать векторизованные функции NumPy на массивах NumPy, где итерация будет обрабатываться быстрым собственным кодом. Вот как писать код таким образом:

import numpy as np 
from pylab import * 

def f(t,v): 
    # reproduce "y" with vectorized functions 
    temp_a = np.sign(v) 

    # reproduce "z" with vectorized functions 
    temp_b = np.log10(np.maximum(np.abs(v), 1.0)) 

    # could also do something like 
    # abs_v = np.abs(v) 
    # temp_b = np.where(abs_v >= 1, np.log10(abs_v), np.log10(1)) 

    return temp_a * temp_b + t 

n = 256 
x = np.linspace(0,100,n) 
y = np.linspace(-50,+50,n) 
X,Y = np.meshgrid(x,y) 

contourf(X, Y, f(X,Y), 15, alpha=.75, cmap='jet') 
C = contour(X, Y, f(X,Y), 15, colors='black', linewidth=.5) 
show() 

Рекомендуемая литература:

Я также предлагаю не использовать pylab но импортировать модули, нужно явно. например здесь вы бы сделали import matplotlib.pyplot as plt и использовали plt.contour и plt.show(). См. Pylab discussion here и here.

+0

Большое спасибо. Я все еще немного обдумываю это. Не могли бы вы исправить опечатку в коде? (temp_c действительно должен быть temp_b) – FearUs

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