我想在Fortran中执行类似的操作:
program where
real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /)
print *, a(a>7)
end program
import numpy
a = numpy.array([ 4, 5, 6, 7, 8, 9])
print a[numpy.where(a>7)]
#or
print a[a>7]
我玩过,但到目前为止没有任何工作,但我猜这很简单。
答案 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
会在符合条件的索引处返回logical
与a
对应的数组.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