Fortran相当于python numpy.minimum

时间:2017-11-03 18:42:41

标签: python fortran

我正在尝试在fortran中重写一些python代码,特别是行

separation[a, :] = sum(np.minimum(1 - distances, distances) ** 2)

重要的部分是使用np.minimum来获取两个多维数组的元素最小值。距离是N坐标(x,y,z)的(3,N)数组。我无法在fortran中找到类似的功能,所以我自己编写了:

  do b = 1, N
    temp = 0.0
    do c = 1, 3
      if ((1 - distances(c, b)) .LE. distances(c, b)) then
        temp = temp + (1 - distances(c, b)) ** 2
      else
        temp = temp + (distances(c, b)) ** 2
      end if
    end do
    separation(a, b) = temp
  end do

不出所料,这段代码非常慢,我对fortran的经验不足,所以任何改进此代码或建议替代方法的建议都会受到高度赞赏。

我想也许where语句可能会有所帮助,因为python中的以下代码可以工作

separation[a, :] = sum(np.where(1 - distances <= distances, (1 - distances), distances) ** 2)

虽然fortran有声明,但它们似乎与python的工作方式不同,而且它们似乎在这里没什么用处。

1 个答案:

答案 0 :(得分:0)

它几乎是一样的。大多数fortran内在函数在数组上以分量方式运行(假设你至少有fortran95)

 real a(2,4),b(4)
 a=reshape([.1,.2,.3,.4,.5,.6,.7,.8],shape(a)) 
 b=sum(min(1-a,a)**2,1)
 write(*,'(4f5.2)')b
 end
  

0.05 0.25 0.41 0.13

注意fortran&#39; s sum默认情况下会对整个数组求和。