2014-01-29 62 views
2

我願做這樣的事情在FortranFortran等價於numpy.where()函數?

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] 

我打得左右,但一切都沒有這樣的工作遠,但我猜這是相當簡單的。

+0

我刪除了[tag:python]和[tag:numpy]標記,因爲這主要是Fortran問題,而不是Python問題。 –

+0

@JohnKugelman我認爲至少要留下numpy,因爲它在Fortran中部分實現,那些看標籤的人可能在這裏有寶貴的意見... – MattDMo

+0

@MattDMo看起來很公平。 –

回答

4

我會稍微擴展@VladimirF的答案,因爲我懷疑你不想限制自己的確切打印示例。

a>7返回對應於a.true.在索引logical陣列,其中所述條件被滿足,否則.false.pack內在需要這樣一個掩碼並返回一個數組,其中掩碼中包含.true.的元素。

但是,您可以使用可能適合您的願望的面具做其他事情。例如,有where構造(和where聲明)和merge內在。此外,您可以再次使用pack與掩碼來獲取索引並執行更多涉及的操作。

+0

這是真的,如果你想分配給這樣的子陣列,你必須使用'where'。 –

+0

此外,使用'where'構造,您可以使用'otherwise'來處理不滿足條件的地方。 – Yossarian

4
program where 

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

print *, pack(a,a>7) 

end program