SciPy 条件函数

2024-10-04 07:34:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在学习SciPy,我想玩一点pylabmatplotlib,所以作为一个练习,我试着想象Reddithotfunction。你知道吗

当然,这个代码不起作用,我真的不知道如何谷歌我想要什么。你知道吗

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()

编辑:如果不工作,则意味着它将给我以下错误消息:

---------------------------------------------------------------------------
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()

Tags: lambdainimportmapinputreturnifipython
1条回答
网友
1楼 · 发布于 2024-10-04 07:34:49

错误来自于if a > 0,因为错误说明a的真值是不明确的,它将是一个NumPy数组。你知道吗

为什么a是NumPy数组而不是单个条目?Python的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])]

您可以使用^{}而不是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,而是显式导入所需的模块。e、 在这里你可以做import matplotlib.pyplot as plt,使用plt.contourplt.show()。见Pylab discussion herehere。你知道吗

相关问题 更多 >