首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >f2py:如何将2维列表传递给fortran 77

f2py:如何将2维列表传递给fortran 77
EN

Stack Overflow用户
提问于 2014-08-26 05:48:55
回答 1查看 523关注 0票数 0

我在向fortran传递二维数组时遇到问题。我想组合一堆不重叠的光谱。首先,我选择x轴上的点,然后将所有数据插值到这个新的公共网格中。我将光谱存储在python中的2D列表中。

这在Python2.7中有效,但速度非常慢:

代码语言:javascript
复制
for i in range(len(wlp)):
  print wlp[i],
  for a in range(len(datax)):
    inrange = 0
    if datax[a][0] >= wlp[i] or datax[a][-1] <= wlp[i]:
      for b in range(len(datax[a])-1):
        if float(datax[a][b]) <= wlp[i] and float(datax[a][b+1]) >= wlp[i]:
          sp = float(datax[a][b]); ep = float(datax[a][b+1])
          delx = ep-sp; dely = float(data[a][b+1])-float(data[a][b])
          ji =  (dely/delx)*(wlp[i]-sp)+float(data[a][b])
          inrange = 1
    if inrange == 0: ji = '?0'
    else: ji = ji * weights[a]
    print ji,
  print

在第一列中打印公共x网格,并且在随后的列中打印所有内插谱。如果有一些较短的超出范围,它会打印"?0“。这有助于稍后为每个数据点设置适当的权重。

我最终使用了这个Fortran子例程来使用f2py来加速:

代码语言:javascript
复制
c wlp = x axis points (wavelength)
c lenwlp = length of list wlp, len(wlp)
c datay = 2D python list with flux
c datax = 2D python list with wavelength
c lendatax = number of spectra, len(datax)
c datax_pl = list of the lengths of all spectra
c weights = list of optional weights
c maxi = length of the longest spectrum   

C============================================================================80
       SUBROUTINE DOIT(wlp,lenwlp,datay,datax,lendatax,datax_pl,
     .                 weights,maxi)
C============================================================================80
       INTEGER  I,a,b,lenwlp,inrange,datax_pl(*),maxi,lendatax
       DOUBLE PRECISION WLP(*),SP,EP,DELY,DELX,ji
       DOUBLE PRECISION WEIGHTS(*)
       DOUBLE PRECISION DATAY(lendatax,maxi)
       DOUBLE PRECISION DATAX(lendatax,maxi)   

 2     FORMAT (E20.12,  1X, $)
 3     FORMAT (A, $)
 4     FORMAT (1X)
       I = 1
       DO WHILE (I.LE.lenwlp)
         WRITE(*,2) WLP(I)
         DO a=1,lendatax
           inrange = 0
           ji = 0.0
           IF (datax(a,1).ge.WLP(I) .or.
     .         datax(a,datax_pl(a)).le.WLP(I)) THEN
             DO b=1,datax_pl(a)-1
               IF (DATAX(a,b).LE.WLP(I) .and.
     .           DATAX(a,b+1).GE.WLP(I)) THEN
                   SP = DATAX(a,b); EP = DATAX(a,b+1)
                   DELX = EP - SP; DELY = datay(a,b+1)-datay(a,b)
                   if (delx.eq.0.0) then
                     ji = datay(a,b)
                   else
                     ji = (DELY/DELX)*(WLP(I)-SP)+datay(a,b)
                   end if
                   inrange = 1
               END IF
             END DO
           END IF
           IF (inrange.eq.0) THEN
             WRITE(*,3) ' ?0'
           ELSE
             WRITE(*,2) ji*WEIGHTS(a)
           END IF
         END DO
         I = I + 1
         write(*,4)
       END DO
       END

它是用gfortran 4.8 fine编译的。然后我在Python代码中导入它,设置列表并运行子例程:

代码语言:javascript
复制
import subroutines
wlp = [...]
data = [[...],[...],[...]]
datax = [[...],[...],[...]]
datax_pl = [...]
weights = [...]
maxi = max(datax_pl)

subroutines.doit(wlp,len(wlp),data,datax,len(datax),datax_pl,weights,maxi)

然后返回:

代码语言:javascript
复制
ValueError: setting an array element with a sequence.

我传递了列表和最长谱的长度(maxi),这应该定义fortran中的最大维度(?)。我不需要返回值,所有内容都打印在stdout上。

问题必须出现在数组声明的开头。我没有这方面的经验...任何建议都是值得感谢的。

EN

回答 1

Stack Overflow用户

发布于 2014-08-27 16:38:34

正如我在注释中所说的,您不能将Python列表传递给f2py过程。必须使用与numpy或C数组兼容的Fortran数组。

您显示的错误消息来自此问题。

您可以从列表http://docs.scipy.org/doc/numpy/user/basics.creation.html创建数组

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25494889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档