【问题标题】:"If" function used for array in PythonPython中用于数组的“If”函数
【发布时间】:2011-10-27 14:59:26
【问题描述】:

我有这个功能:

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

【问题讨论】:

  • 我不知道 pylab 所以.. r2 到底是什么,你想用它做什么?如果它是一个数组 - 你想比较什么?所有元素都必须满足条件或..?
  • r2 is r^2 of an ellipsis... g(X,Y) 应该是一个类似 mgrid 但在 X,Y 的每个点上评估的值。
  • 请告诉我们mgrid 是什么对象:print repr(mgrid) 举个小例子。

标签: python numpy matplotlib


【解决方案1】:

表达式 r2 > 0.04 的计算结果是一个布尔值的 NumPy 数组,因此您不能在 if 语句中使用它。不过,您可以将其自动重新解释为数字:

def q(x,y):
    r2 = (x/2.)**2 + (2.0*y)**2
    return 1.5 * (r2 <= 0.04)

【讨论】:

  • 这不是最通用的解决方案,但它解决了这个特定问题的问题。你知道在更多情况下避免这种情况的方法吗(更多 if's else's 等)
  • @J.C.Leitão:如何向量化特定代码段的细节取决于代码的细节。在这个特定的例子中,它比较简单,在其他情况下它更难,有时甚至是不可能的。给定的技术通常可以扩展到多个if 语句,可能通过使用&amp;| 运算符或部分赋值r2[r2 &gt; 0.04] = ...
  • 好的。感谢 Sven 分享的想法和知识。
【解决方案2】:

您可以使用map 将您的函数应用于每一对元素。

【讨论】:

  • 在给定的上下文中,这个答案是错误的。 XY 是二维数组,所以 zip() 会产生成对的行,所以问题仍然没有解决。此外,NumPy 的重点是避免这种 Python 循环遍历所有元素。
  • 好的,我删除了非工作代码。但我回答的精神只是建议将“地图”作为解决问题的一种可能方式;它并不意味着是最有效的解决方案。
  • 删除了我的反对票,因为答案不再是错误的。老实说,我认为它仍然不是特别有用。
猜你喜欢
  • 2012-10-28
  • 2020-02-28
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多