【问题标题】:Fortran equivalent of numpy.where() function?Fortran 相当于 numpy.where() 函数?
【发布时间】:2020-12-21 23:59:16
【问题描述】:

我想在Fortran做这样的事情:

program where

real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /)

print *, a(a>7)

end program

Python 中,我通常会使用NumPy 这样做:

import numpy

a = numpy.array([ 4, 5, 6, 7, 8, 9])

print a[numpy.where(a>7)]

#or 

print a[a>7]

我玩过,但到目前为止没有任何效果,但我猜它相当简单。

【问题讨论】:

  • 我删除了 pythonnumpy 标签,因为这主要是 Fortran 问题,而不是 Python 问题。
  • @JohnKugelman 我会主张至少保留 numpy,因为它部分是在 Fortran 中实现的,并且那些关注标签的人可能在这里有有价值的输入......
  • @francescalus 是的。谢谢!

标签: numpy fortran slice


【解决方案1】:

我将稍微扩展@VladimirF 的答案,因为我怀疑您不想将自己限制在确切的打印示例中。

a>7 返回对应于alogical 数组,.true. 位于满足条件的索引处,否则为.false.pack 内部函数采用这样的掩码并返回一个数组,其中包含掩码中带有 .true. 的那些元素。

但是,您可以使用可能符合您numpy.where 愿望的面具做其他事情。例如,有where 构造(和where 语句)和merge 内在函数。此外,您可以再次使用 pack 和掩码来获取索引并进行更多相关操作。

【讨论】:

  • 确实如此,如果要分配给这样的子数组,必须使用where
  • 另外,使用where 构造,您可以使用elsewhere 来处理不满足条件的地方。
【解决方案2】:
program where

real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /)

print *, pack(a,a>7)

end program

【讨论】:

    【解决方案3】:

    您可以在这里找到相关主题:Better way to mask a Fortran array?

    我认为 where 和 merge 都可以完成任务。

    在python中,where可以根据掩码分配不同的值,例如

    a = np.array([4, 5, 6, 7, 8, 9])
    b = np.where(a>7, 1, -1)
    

    b 将是数组([-1, -1, -1, -1, 1, 1])

    在 Fortran 中,相当于 merge

    real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /)
    real, allocatable :: b(:)
    b = merge(1,-1,a>7)
    print*, b
    end
    

    MERGE 函数根据掩码的值选择替代值。 http://www.lahey.com/docs/lfpro78help/F95ARMERGEFn.htm

    哪里也可以做到这一点,但稍微复杂一些。

    real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /)
    real, allocatable :: b(:)
    b = a
    where (a>7)
      b = 1
    else where
      b = -1
    end where
    print*, b
    end
    

    这是一个简短的版本

    b = a
    b = -1
    where (a>7) b = 1
    

    您可以在这里找到更多信息:http://www.personal.psu.edu/jhm/f90/statements/where.html

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2011-10-08
      相关资源
      最近更新 更多