Python 将数组传递给具有假定形状的函数

Python 将数组传递给具有假定形状的函数,python,arrays,fortran,f2py,Python,Arrays,Fortran,F2py,我正在用Python调用一个由f2py绑定的Fortran函数。当我显式地对数组进行尺寸标注时,sum调用返回所需的结果,但当我使用假定形状时,它返回0 ! foo.f95 function sum_test(arr) IMPLICIT NONE integer(8), dimension(:), intent(in) :: arr integer(8) :: sum_test sum_test = sum(arr) end function sum_test Python方面

我正在用Python调用一个由f2py绑定的Fortran函数。当我显式地对数组进行尺寸标注时,sum调用返回所需的结果,但当我使用假定形状时,它返回0

! foo.f95
function sum_test(arr)
  IMPLICIT NONE
  integer(8), dimension(:), intent(in) :: arr
  integer(8) :: sum_test
  sum_test = sum(arr)
end function sum_test
Python方面:

import foo
foo.sum_test([1,2,3])
0L
import foo
foo.sum_test([1,2,3])
6L
如果我在Fortran中显式标注:

! foo.f95
function sum_test(arr)
  IMPLICIT NONE
  integer(8), dimension(3), intent(in) :: arr
  integer(8) :: sum_test
  sum_test = sum(arr)
end function sum_test
Python方面:

import foo
foo.sum_test([1,2,3])
0L
import foo
foo.sum_test([1,2,3])
6L
请注意,如果我在假定形状版本上打印我的值,如下所示:

write(*,*) arr
我可以看到数组中的值


很明显,我丢失了一些关键部件

假定形状数组要求调用方传递有关数组边界的信息以及数据地址。执行此操作的机制依赖于实现,并且并非所有实现都记录其方法。Python代码只是传递数据地址,但Fortran(通常)需要一个“描述符”数据结构。(Fortran 2015作为“进一步的C互操作性”的一部分,指定了一种标准的实现方法。)


我建议的是Fortran称之为“可调数组”的数组,在这里您可以将范围作为单独的参数传递。

假定形状数组要求调用者传递有关数组边界的信息以及数据地址。执行此操作的机制依赖于实现,并且并非所有实现都记录其方法。Python代码只是传递数据地址,但Fortran(通常)需要一个“描述符”数据结构。(Fortran 2015作为“进一步的C互操作性”的一部分,指定了一种标准的实现方法。)


我的建议是Fortran所称的“可调数组”,您可以将范围作为单独的参数传递。

您好,欢迎光临。尽量保持你的帖子体贴,避免冗长的介绍、感谢和问候。您的名字已经在带有图标的帖子下方,无需重复。如果您有理由这样做,请使用标签并添加特定版本(此处不提供)。更多的人使用更通用的标签,因此你更有可能得到答案。此外,最好使用大写字母(I、Fortran、Python),否则在某些人看来您可能会显得“懒惰”。报告您使用的软件版本和编译器标志也很好。您好,欢迎。尽量保持你的帖子体贴,避免冗长的介绍、感谢和问候。您的名字已经在带有图标的帖子下方,无需重复。如果您有理由这样做,请使用标签并添加特定版本(此处不提供)。更多的人使用更通用的标签,因此你更有可能得到答案。此外,最好使用大写字母(I、Fortran、Python),否则在某些人看来您可能会显得“懒惰”。报告您使用的软件版本和编译器标志也很好。感谢您的解释!自f90以来,在f77中称为可调数组的称为假定大小。正如Steve所说,这可能是您想要的跨语言调用,因此可以使用f2003风格的C互操作性,而不依赖于提供描述符。我不确定您的答案。我认为假定的形状数组应该由f2py支持。当然,f2py必须使用正确编译器的正确调用约定,但它应该得到支持。当我使用子例程而不是函数时,一切都很好。。在使用函数时,我还必须传递维度才能使其工作。我不同意@tim18的回答。可调阵列和假定大小是两件不同的事情。可调数组是一个伪参数数组,其中一个或多个维度是同时也是伪参数的变量(或公共变量、模块变量或主机关联变量)。假定大小数组的最后一个上限为*且没有定义的上限。可调数组在当前的Fortran中并不是这样称呼的,它们是“显式形状数组”的子集,其中的边界是“规范表达式”。谢谢您的解释!自f90以来,在f77中称为可调数组的称为假定大小。正如Steve所说,这可能是您想要的跨语言调用,因此可以使用f2003风格的C互操作性,而不依赖于提供描述符。我不确定您的答案。我认为假定的形状数组应该由f2py支持。当然,f2py必须使用正确编译器的正确调用约定,但它应该得到支持。当我使用子例程而不是函数时,一切都很好。。在使用函数时,我还必须传递维度才能使其工作。我不同意@tim18的回答。可调阵列和假定大小是两件不同的事情。可调数组是一个伪参数数组,其中一个或多个维度是同时也是伪参数的变量(或公共变量、模块变量或主机关联变量)。假定大小数组的最后一个上限为*且没有定义的上限。可调数组在当前的Fortran中并不是这样称呼的,它们是“显式形状数组”的子集,其中边界是“规范表达式”。