python - 使用 numpy 中的 ctypeslib 返回错误

标签 python c numpy ctypes

这些是 C 文件:

addone.h

#ifndef __ADDONE
#define __ADDONE
void  addone(float *in_data, int size);
#endif

addone.c

void addone(float *in_data, int size)
{
  int i = 0;
  for(int i = 0; i < size; i++)
  {
    in_data[i] = in_data[i] + 1;
  }
}

我正在尝试将此函数与 numpy 中的 ctypes 一起使用:

import numpy as np
import numpy.ctypeslib as npct
from ctypes import c_int

array_1d_float = npct.ndpointer(dtype=np.float, ndim=1, flags="CONTIGUOUS")
libcd = npct.load_library("libaddone", ".")
libcd.addone.restype = None
libcd.addone.argtypes = [array_1d_float, c_int]

def addone(in_array):
    return libcd.addone(in_array, len(in_array))

def main():
    out = np.array([1,2,3], dtype=np.float)
    print out
    addone(out)
    print out

if __name__ == "__main__":
    main()

但是当我运行这个文件时,我得到了错误的结果:

python test.py
[1. 2. 3.]
[24.00000378   2.00000047   3.     ]

如何解决?

最佳答案

您可以使用以下方法解决此问题:

void addone(double *in_data, int size)

代替:

void addone(float *in_data, int size)

https://stackoverflow.com/a/16964006 中所述, np.float 的别名的内置float类型,对应中的double .

在用 double 替换 float 之前:

$ python test.py
[ 1.  2.  3.]
[ 24.00000378   2.00000047   3.        ]

float 替换为 double 并重新编译库后:

$ python test.py
[ 1.  2.  3.]
[ 2.  3.  4.]

或者,您可以留下您的 代码不变,并在 中使用 np.float32 而不是 np.float代码。

关于python - 使用 numpy 中的 ctypeslib 返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37198473/

相关文章:

python - 在不运行 __init__ 的情况下测试实例方法的最佳方法

python - 如何计算列表中的多个对象值

Python:我有一个全局声明,我需要在不同的Python程序中调用它

c - 如何在 VS Code 调试 session 中持续观察变量及其值?

python - 'numpy.ndarray' object has no attribute 'barh' 是什么意思,如何纠正?

Python 将 N 维体积划分为统一的子体积

c++ - 如何使用 fork() 创建进程链?

c - 如何从 Clang 中的 Expr 对象获取 Stmt 类对象

python-2.7 - NFFT的傅立叶系数 - 非均匀快速傅立叶变换?

python - 将 numpy 数组作为变量添加到 Xarray 数据集