• numpy学习(将条件逻辑表述为数组运算)


    numpy.where函数是三元表达式xifconditionelsey的矢量化版本。假设我们有一个布尔数组和两个值数组:

    假设我们想要根据cond中的值选取xarr和yarr的值:当cond中的值为True时,选取xarr的值,否则从yarr中选取。列表推导式的写法应该如下所示:

    这有几个问题。第一,它对大数组的处理速度不是很快(因为所有工作都是由纯Python完成的)。第二,无法用于多维数组。若使用np.where,则可以将该功能写得非常简洁:

    np.where的第二个和第三个参数不必是数组,它们都可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。假设有一个由随机数据组成的矩阵,你希望将所有正值替换为2,将所有负值替换为-2。若利用np.where,则会非常简单:

    传递给where的数组大小可以不相等,甚至可以是标量值。

    只要稍微动动脑子,你就能用where表述出更复杂的逻辑。想象一下这样一个例子,我有两个布尔型数组cond1和cond2,希望根据4种不同的布尔值组合实现不同的赋值操作:

    result = [ ]

    for i in range( n):

      if cond1[ i] and cond2[ i]:

        result. append( 0)

      elif cond1[ i]:

        result. append( 1)

      elif cond2[ i]:

        result. append( 2)

      else:

        result. append( 3)

    虽然不是非常明显,但这个for循环确实可以被改写成一个嵌套的where表达式:

    np.where(cond1&cond2,0,

                np.where(cond1,1,

                         np.where(cond2,2,3)))

  • 相关阅读:
    哈希算法原理和一致性哈希算法
    负载均衡之轮循算法
    Mybatis的使用
    Spring与SpringMVC的整合
    编程式事务与声明式事务
    八大排序方法及对Arrays类的排序实现探讨
    单例模式的线程安全性
    HotSpot对象的创建及内存布局
    逃逸分析、栈上分配、标量替换、同步替换
    java编译器和解释器
  • 原文地址:https://www.cnblogs.com/anner-nie/p/8544203.html
Copyright © 2020-2023  润新知