与python numpy.minimum等效的Fortran

与python numpy.minimum等效的Fortran,python,fortran,Python,Fortran,我试图用fortran重新编写一些python代码,特别是这行代码 separation[a,:]=和(np.最小值(1-距离,距离)**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.

我试图用fortran重新编写一些python代码,特别是这行代码

separation[a,:]=和(np.最小值(1-距离,距离)**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)

separation[a,:]=sum(np.where(1-距离几乎相同。大多数fortran内部函数在数组上按组件操作(假设您至少有fortran 95)

0.05 0.25 0.41 0.13


注意fortran的
sum
默认情况下会对整个数组求和。

几乎相同。大多数fortran内部函数在数组上按组件操作(假设您至少有fortran 95)

0.05 0.25 0.41 0.13


注意fortran的
sum
默认情况下会对整个数组求和。

谢谢!真不敢相信它这么简单。谢谢!真不敢相信它这么简单。
 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