首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于F2PY的可调Fortran阵列

基于F2PY的可调Fortran阵列
EN

Stack Overflow用户
提问于 2015-08-18 01:00:56
回答 2查看 769关注 0票数 2

我一直试图包装一些Fortran库,并增强一些例程,使它们能够使用numpy数组的输入和输出,而不是单个输入和输出。在大多数情况下,我是成功的,并且已经完成了一些简单的例程。唯一的问题是我的f_prog例程。

代码语言:javascript
复制
subroutine f_prog(mu,x,y,m)
    integer :: m, i
    !f2py intent(hide) :: m
    DOUBLE PRECISION, intent(in) :: mu
    DOUBLE PRECISION, dimension(m , 6), intent(in) :: x
    DOUBLE PRECISION, dimension(m , 6), intent(out) :: y
    DOUBLE PRECISION, dimension( 6 ) :: y_temp(6)
    do i=1,m
        call prog(mu,x(i,1:6),y_temp)   
        y(i,1:6)=y_temp(1:6)
    enddo   
end subroutine

当使用输入f_prog( 1,(1,2,3,4,5,6) )运行f_prog时,我收到错误:

代码语言:javascript
复制
    In [21]: clout(gm[0],sc_mars[0])
    1-th dimension must be 6 but got 0 (not defined).
    ---------------------------------------------------------------------------
    error                                    Traceback (most recent call last)
    <ipython-input-21-1614a809900e> in <module>()
    ----> 1 clout(gm[0],sc_mars[0])

    error: failed in converting 2nd argument `x' of pythage_new.f_clout to C/Fortran array

但是当我使用f_prog( 1,(1,2,3,4,5,6,1,2,3,4,5,6) )运行它时,我收到了预期的输出。注意,所有数组输入都使用Python中的Numpy库,而不是Python的标准列表结构。

这个错误使我相信,当数组只是一行时,F2PY并不尊重数组的维度。

任何建议都很感谢,谢谢!

如下文所述,还可以将数组嵌套如下:

代码语言:javascript
复制
f_prog( 1 , [[1,2,3,4,5,6]] )

虽然,我试图创建一个标准库,所以每次用户想要使用这个例程时,强迫用户在变量周围添加括号是不太实际的。

EN

回答 2

Stack Overflow用户

发布于 2015-08-19 08:42:27

我不确定我是否理解你的问题。特别是您所说的可调整的、可分配的或动态大小的数组。代码中没有任何数组的动态更改。F2py子程序只接受一些数组,不管它是如何出现的,它只需要在第二维度中有正确的大小6。

您还说您使用的是NumPy数组,但是代码中没有numpy数组。如果您想使用numpy数组,那么只需创建一个:

代码语言:javascript
复制
#create a Numpy array in Fortran ordering
arr = numpy.zeros([3,6], order='F')

#fill in some values
arr[:,:] = numpy.random.rand(3,6)

#run your f2py code
f_prog.f_prog(1, arr)

如果您需要输入一个向量,您应该将它重新塑造为一个2D数组,因为子例程需要一个2D数组。

代码语言:javascript
复制
f_prog.f_prog(1, numpy.reshape([1.,2.,3.,4.,5.,6.], [1,6],order='F'))
票数 2
EN

Stack Overflow用户

发布于 2015-08-18 02:38:47

在表达式f_prog( 1 , ([1,2,3,4,5,6]) )中,[1,2,3,4,5,6]周围的括号没有作用(就像(1)1一样),所以参数是一维序列。为了使它看起来像一个二维序列,您可以添加一个后缀逗号a,以便它是一个包含列表:f_prog(1, ([1,2,3,4,5,6],))的元组。或者使用嵌套列表:f_prog(1, [[1,2,3,4,5,6]])

更新:问题(正如我现在所理解的)是,f2py生成的包装器比您希望的更挑剔参数的形状。Fortran文件说参数是2-d,所以f2py坚持让用户用二维numpy数组调用函数。这是很容易做到的,但如果函数的用户也可以传递一个一维数组,并让代码将其视为包含单个行的二维数组,那就太好了。

一个可能的解决方法是围绕f2py函数创建一个薄包装器。在包装器中,对数组参数调用atleast_2d,然后将其传递给f2py函数。大致是这样的:

代码语言:javascript
复制
def func(mu, x):
    x = np.atleast_2d(x)
    y = f_prog(mu, x)  # Call the function that was generated by f2py.
    return y
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32061995

复制
相关文章

相似问题

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