&引用;如果;Python中用于数组的函数
我有这个功能:&引用;如果;Python中用于数组的函数,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有这个功能: def q(x,y): r2 = (x/2.)**2 + (2.0*y)**2 if (r2 > 0.04): return 0. else: return 1.5 我想用这样的方式来称呼它 from pylab import * dl=0.025 X, Y = mgrid[-0.5:0.5:dl, -0.5:0.5:dl] g(X,Y) 但很明显,这在比较中是一个错误 这可以在不必为X和Y做for循环的情况下完
def q(x,y):
r2 = (x/2.)**2 + (2.0*y)**2
if (r2 > 0.04):
return 0.
else:
return 1.5
我想用这样的方式来称呼它
from pylab import *
dl=0.025
X, Y = mgrid[-0.5:0.5:dl, -0.5:0.5:dl]
g(X,Y)
但很明显,这在比较中是一个错误
这可以在不必为X和Y做for循环的情况下完成吗?
因为如果我想调用q(x,y)进行两个双精度运算,那么在这种情况下必须重新实现for循环
编辑:(将此添加到问题中,因为该问题太长,无法发表评论而无法回答,但可能有助于其他人回答。)
看起来pylab.mgrid
与numpy.mgrid
相同
调整为numpy
,此代码
import numpy
def q(x,y):
r2 = (x/2.)**2 + (2.0*y)**2
if (r2 > 0.04):
return 0.
else:
return 1.5
dl=0.025
X, Y = numpy.mgrid[-0.5:0.5:dl, -0.5:0.5:dl]
q(X,Y)
给出了这个错误
if (r2 > 0.04):
ValueError: The truth value of an array with more than one element is
ambiguous. Use a.any() or a.all()
您可以使用将函数应用于每对元素。您可以使用将函数应用于每对元素。表达式
r2>0.04
计算结果为布尔值的NumPy数组,因此您不能在if
语句中使用它。您可以将其自动重新解释为数字,不过:
def q(x,y):
r2 = (x/2.)**2 + (2.0*y)**2
return 1.5 * (r2 <= 0.04)
def q(x,y):
r2=(x/2.)**2+(2.0*y)**2
返回1.5*(r2表达式r2>0.04
的计算结果为布尔值的NumPy数组,因此您不能在if
语句中使用它。您可以将其自动重新解释为数字,但:
def q(x,y):
r2 = (x/2.)**2 + (2.0*y)**2
return 1.5 * (r2 <= 0.04)
def q(x,y):
r2=(x/2.)**2+(2.0*y)**2
返回1.5*(r2我不知道pylab所以..r2
中到底是什么,你想用它做什么?如果它是一个数组-你想比较什么?所有元素都必须满足条件或..?r2是省略号的r^2…g(X,Y)应该是类似于mgrid的,但在X,Y的每个点上都有值。请告诉我们mgrid
是什么对象:print repr(mgrid)
举个小例子。mgrid是:我不知道pylab,所以..r2中到底是什么?你想用它做什么?如果它是一个数组-你想比较什么?所有元素都必须满足条件或..r2是省略号的r^2…g(X,Y)应该是类似于mgrid的,但在X,Y的每个点上都有值。请告诉我们对象mgrid
是什么:print repr(mgrid)
,举个小例子。mgrid是:在给定的上下文中,这个答案是错误的。X
和Y
是二维数组,因此zip()
将产生成对的行,因此问题仍然没有解决。此外,NumPy的全部目的是避免在所有元素上出现这种Python循环。好的,我删除了不起作用的代码。但我的回答的精神只是建议将“map”作为解决问题的一种可能方法;它并不意味着是最有效的解决方案。Remo我投了我的反对票,因为答案不再是错误的。老实说,我认为这仍然没有特别的帮助。在给定的上下文中,这个答案是错误的。X
和Y
是二维数组,所以zip()
将产生成对的行,因此问题仍然没有解决。此外,NumPy的全部目的是避免在所有元素上出现这种Python循环。好的,我删除了不起作用的代码。但我的回答的精神只是建议将“map”作为解决问题的一种可能方法;它并不意味着是最有效的解决方案。Remo我投了反对票,因为答案不再是错的。老实说,我认为这仍然没有特别的帮助。这不是最普遍的解决方案,但它解决了这个具体问题。你知道在更多情况下避免这种情况的方法吗(更多的如果是其他的,等等)@J.C.Leitão:如何向量化一段特定代码的细节取决于代码的细节。在这个特定的例子中,它相对简单,在其他情况下更难,有时甚至不可能。给定的技术通常可以扩展到多个if
语句,可能通过使用&
>和|
运算符或部分分配r2[r2>0.04]=…
。好的。谢谢Sven分享的想法和知识。这不是最普遍的解决方案,但它解决了这个特定问题。你知道在更多情况下避免这种情况的方法吗(更多的如果是其他情况等)@J.C.Leitão:如何向量化一段特定代码的细节取决于代码的细节。在这个特定的例子中,它相对简单,在其他情况下更难,有时甚至不可能。给定的技术通常可以扩展到多个if
语句,可能通过使用&
>和|
运算符或部分分配r2[r2>0.04]=…
。好的。谢谢Sven分享您的想法和知识。