我一直试图包装一些Fortran库,并增强一些例程,使它们能够使用numpy数组的输入和输出,而不是单个输入和输出。在大多数情况下,我是成功的,并且已经完成了一些简单的例程。唯一的问题是我的f_prog例程。
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时,我收到错误:
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并不尊重数组的维度。
任何建议都很感谢,谢谢!
如下文所述,还可以将数组嵌套如下:
f_prog( 1 , [[1,2,3,4,5,6]] )虽然,我试图创建一个标准库,所以每次用户想要使用这个例程时,强迫用户在变量周围添加括号是不太实际的。
发布于 2015-08-19 08:42:27
我不确定我是否理解你的问题。特别是您所说的可调整的、可分配的或动态大小的数组。代码中没有任何数组的动态更改。F2py子程序只接受一些数组,不管它是如何出现的,它只需要在第二维度中有正确的大小6。
您还说您使用的是NumPy数组,但是代码中没有numpy数组。如果您想使用numpy数组,那么只需创建一个:
#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数组。
f_prog.f_prog(1, numpy.reshape([1.,2.,3.,4.,5.,6.], [1,6],order='F'))发布于 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函数。大致是这样的:
def func(mu, x):
x = np.atleast_2d(x)
y = f_prog(mu, x) # Call the function that was generated by f2py.
return yhttps://stackoverflow.com/questions/32061995
复制相似问题