Python SciPy条件函数

Python SciPy条件函数,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我目前正在学习SciPy,我想玩一玩pylab和matplotlib,作为一个练习,我试着将Reddit的hot可视化 当然,这段代码不起作用,我也不知道如何用谷歌搜索我想要的东西 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) &

我目前正在学习
SciPy
,我想玩一玩
pylab
matplotlib
,作为一个练习,我试着将
Reddit
hot
可视化

当然,这段代码不起作用,我也不知道如何用谷歌搜索我想要的东西

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()
从pylab导入*
将numpy作为np导入
def f(t,v):
y=λa:1如果a>0,则为-1如果a<0,则为-0
z=λa:log10(abs(a)),如果abs(a)>=1,则为log10(1)
返回映射(z,v)*映射(y,v)+t
n=256
x=np.linspace(0100,n)
y=np.linspace(-50,+50,n)
十、 Y=np.meshgrid(X,Y)
轮廓f(X,Y,f(X,Y),15,α=0.75,cmap='jet')
C=轮廓(X,Y,f(X,Y),15,颜色='黑色',线宽=.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()
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
13 X,Y=np.网格(X,Y)
14
--->15轮廓f(X,Y,f(X,Y),15,alpha=.75,cmap='jet')
16 C=轮廓(X,Y,f(X,Y),15,颜色=黑色,线宽=0.5)
17 show()
在f(t,v)中
6 z=λa:log10(abs(a)),如果abs(a)>=1,则为log10(1)
7.
---->8返回映射(z,v)*映射(y,v)+t
9
10 n=256
在(a)段中
4 y=λa:1如果a>0,则为-1如果a<0,则为0
5.
---->6 z=λa:log10(abs(a)),如果abs(a)>=1,则为log10(1)
7.
8返回映射(z,v)*映射(y,v)+t
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

如果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、 g.在这里,您将执行
导入matplotlib.pyplot作为plt
并使用
plt.contour
plt.show()
。请参阅和。

不知道hot函数、“不工作”是什么样子,工作是什么样子,或者您的问题是什么。投票决定关闭。我编辑了帖子并展示了不起作用的内容。这看起来很重要:“ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()”是的,但我不理解错误,当我查找它时,我得到了一个我没有的问题的解决方案。我正在尝试使用
map
在数组上应用函数,它抛出了这个错误。非常感谢。我还在想这件事。你能纠正一下代码中的一个错误吗?(临时c实际上应该是临时b)