【问题标题】:f2py error wrong elsizef2py错误错误elsize
【发布时间】:2016-10-17 01:02:13
【问题描述】:
  • 64 位笔记本上的操作系统 Ubuntu 14.04
  • 我使用 f2py 编译了一个用 Fortran 代码编写的函数
  • 然后我从 Python 调用这个函数。

我收到错误消息: ValueError: failed to initialize intent(inout) array -- 预期 elsize=4 但得到 8

看起来我的 Fortran 代码正在编译为 32 位,尽管是 64 位机器。 在 32 位计算机上一切正常。 我做错了什么?

【问题讨论】:

    标签: python-2.7 ubuntu-14.04 elf f2py


    【解决方案1】:

    看来我找到了解决方案。 首先,仅当将整数数组传递给 Fortran 子例程时才会引发报告的错误。当我使用默认的 Python int 和 float 时,整数值和实数数组(我想也是值)正确传递,而在 Fortran 中我将它们声明为 INTEGER*4 和 REAL*8。 但在整数数组的情况下,这不起作用。需要进行较小的更正,即 Python 中的整数数组应声明为(或转换为)np.int32 类型,并在 Fortran 子例程中声明为 INTEGER*4。 以下是在我的项目中有效的数组声明/转换示例。

    Python:

    import numpy as np
    import Fortran_file
    #.... some code
    # variable "data" is integer 2-D array
    data = data.astype(np.int32) # data.astype(int) gives error
    data =  np.asfortranarray(data)
    array1 = np.zeros(5, dtype=np.int32, order='F') # dtype=int gives error
    array2 = np.zeros(5, dtype=float, order='F')
    ivalue = 2 # conversion to np.int32 is not needed
    Fortran_file.Fortran_subroutine(data, ivalue, array1, array2)
    

    Fortran:

    SUBROUTINE Fortran_subroutine (matrix, value, array1, array2)
    IMPLICIT NONE
    INTEGER*4 :: matrix(:,:)
    !f2py  INTENT(INOUT) :: matrix(:,:)
    INTEGER*4 :: value
    !f2py  INTENT(INOUT) :: value
    INTEGER*4 :: array1(5)
    !f2py INTENT(INOUT):: array1(5)
    REAL*8 :: array2(5)
    !f2py INTENT(INOUT) :: array2(5)
    

    同样,这在 64 位操作系统上是有意义的。当我使用 32 位操作系统时,没有这些技巧,一切正常。

    我没有尝试过其他数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多