【问题标题】:Elementwise if elif function in python using arrays使用数组的python中的元素if elif函数
【发布时间】:2012-10-28 17:44:09
【问题描述】:

我有一个定义

def myfunc(a, b):
    if a < (b*10):
        result = a*2
    else:
        result = a*(-1)
    return result

现在,当我使用 for 循环一个一个地输入我的 ab 值时,这显然工作得很好,但是它需要很长时间(我已经稍微简化了定义)而且我从经验中知道传递在值中作为数组将加快速度。

那么如何修改此代码以接受数组。我使用了any()all() 命令,但我一定是用错了,因为我的函数只输出一个值而不是一组值。

我想要的输出的一个例子是:

>>>a = np.array([1,5,50,500])
>>>b = 1
>>>print myfunc(a, b)
array([-1, -5, 100, 1000])

【问题讨论】:

    标签: python arrays if-statement numpy definition


    【解决方案1】:

    使用列表推导:

    myarray = [1, 5, 50, 500]
    b = 1
    [myfunc(a, b) for a in myarray]
    

    【讨论】:

      【解决方案2】:

      你的函数很简单,可以完全删除:

      arr = [1, 5, 50, 500]
      arr = [a * 2 if a < b * 10 else -a for a in arr]
      

      【讨论】:

      • 但我希望列表 comp 比 numpy 数组操作慢得多。
      • @mgilson:当然。我只是没有 numpy 经验
      【解决方案3】:

      你可以使用np.where:

      def myfunc(a, b):
          return np.where(a < b*10, a*2, -a)    
      

      例如,

      In [48]: a = np.array([1, 5, 50, 500])
      
      In [49]: b = 1
      
      In [50]: myfunc(a, b)
      Out[50]: array([   2,   10,  -50, -500])
      

      请注意,输出与您想要的输出不同,但与您发布的代码一致。您当然可以通过反转不等式来获得所需的输出:

      def myfunc(a, b):
          return np.where(a > b*10, a*2, -a)
      

      然后

      In [52]: myfunc(a, b)
      Out[52]: array([  -1,   -5,  100, 1000])
      

      【讨论】:

      • 非常感谢!尽管这确实有效,但还有另一条评论只是简单地将 np.all(a
      • np.all 返回单个布尔值 TrueFalse。它只是测试a 的每个元素(以及b 的相应元素)是否满足a &lt; b*10。 (如果条件为真元素,则返回True,否则返回False)。在这种情况下,我认为这对您没有帮助。
      • 很好的答案!我不知道您可以将np.where 与另外两个参数一起使用,我肯定会更频繁地使用它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      相关资源
      最近更新 更多