与numpy.where()函数等效的Fortran语言?

与numpy.where()函数等效的Fortran语言?,numpy,fortran,slice,Numpy,Fortran,Slice,我想这样做: 在这种情况下,我通常会这样做: 进口numpy a=numpy.array[4,5,6,7,8,9] 打印一个[numpy.where>7] 或 打印a[a>7] 我已经试过了,但到目前为止还没有成功,但我猜这相当简单。我将用@VladimirF稍微扩展一下答案,因为我怀疑您不想将自己局限于确切的印刷示例 program where real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /) print *, pack(a,a>7) end progra

我想这样做:

在这种情况下,我通常会这样做:

进口numpy a=numpy.array[4,5,6,7,8,9] 打印一个[numpy.where>7] 或 打印a[a>7]
我已经试过了,但到目前为止还没有成功,但我猜这相当简单。

我将用@VladimirF稍微扩展一下答案,因为我怀疑您不想将自己局限于确切的印刷示例

program where

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

print *, pack(a,a>7)

end program
a> 7返回与.true对应的逻辑数组。在满足条件的索引处,.false。否则pack内在函数接受这样一个掩码,并返回一个数组,其中包含具有.true的元素。戴着面具


然而,你可以用面具做其他事情,这可能适合你的要求。例如,有where构造、where语句和merge内在函数。此外,您还可以将pack与mask一起使用,以获取索引并执行更复杂的操作。

您可以在此处找到相关主题:

我认为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]

在Fortran中,与此等效的是merge

合并函数根据掩码的值选择替代值

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

您可以在此处找到有关位置的更多信息:

我删除了and标记,因为这主要是一个Fortran问题,而不是Python问题。@JohnKugelman我认为至少应该保留numpy,因为它部分是用Fortran实现的,而那些关注标记的人可能在此处有宝贵的输入…@francescalus,没错。谢谢没错,如果你想分配给这样的子数组,你必须使用where。另外,对于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