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

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

我想这样做:

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

导入numpy
a=numpy.array([4,5,6,7,8,9])
打印一个[numpy.where(a>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
返回与
a
对应的
逻辑数组,其中
.true。
在满足条件的索引处,
为false。
否则。
pack
内在函数接受这样一个掩码,并返回一个数组,其中包含掩码中带有
.true.
的元素


然而,你可以用面具做其他事情,这可能适合你的
numpy.where
欲望。例如,有
where
构造(和
where
语句)和
merge
内在语句。此外,您还可以在掩码中再次使用
pack
,以获取索引并执行更多涉及的操作。

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

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

例如,在python中,其中能够根据掩码分配不同的值

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

在Fortran语言中,与之等价的是合并

real :: a(6) = (/ 4, 5, 6, 7, 8, 9 /)
real, allocatable :: b(:)
b = merge(1,-1,a>7)
print*, b
end
合并函数根据掩码的值选择替代值

其中也可以这样做,但它稍微复杂一些

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
构造,可以使用
where
来处理不满足条件的位置。
b = a
b = -1
where (a>7) b = 1