Fortran相当于numpy.where()函数?

时间:2014-01-29 15:35:40

标签: numpy fortran slice

我想在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]

我玩过,但到目前为止没有任何工作,但我猜这很简单。

3 个答案:

答案 0 :(得分:4)

program where

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

print *, pack(a,a>7)

end program

答案 1 :(得分:4)

我会稍微延长@VladimirF的答案,因为我怀疑你不想把自己限制在确切的打印示例中。

a>7会在符合条件的索引处返回logicala对应的数组.true.,否则返回.false.pack内在函数采用这样的掩码并返回一个数组,其中掩码中包含.true.的元素。

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

答案 2 :(得分:1)

您可以在此处找到相关主题: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

where 也可以这样做,但稍微复杂一些。

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