繁体   English   中英

使用带有 ctypes 的 C function 计算 Python 中的熵

[英]Calculating entropy in Python using a C function with ctypes

我正在尝试使用 C function 使用 ctypes 库计算 Python 脚本中的 Sahnnon 熵。

我查阅了一些教程,据我了解,C代码可以是这样的(我叫“entropy.c”:

#include <math.h>
#include <stdio.h>

float entropy(float *p, int n)
{

   int i;
   float ent;

   ent = 0.0;
   for(i=0; i< n; i++)
   {
      if(p[i] > 0.0)
      {
         ent += -p[i] * (double) log( (double) p[i]);
      }
    }

   return ent;
}

在 C 代码中,有一个变量数组 (p) 表示必须计算熵的分布。

现在我以通常的方式将其转换为“共享对象”文件:

$ gcc -fPIC -shared -o entropy.so entropy.c

因此,据我了解,Python 中的代码必须如下所示:

import ctypes

so_file="./entropy.so"

entropy=ctypes.CDLL(so_file)


n=ctypes.c_int(2)
p=(ctypes.c_float * 2)(0.25,0.75)

print(entropy.entropy(p,n))

但是,无论 p 是什么,我总是得到以下结果:

$ python entropy.py
$ 2

我试图找到解决方案,但找不到。 所以问题是我在这里做错了什么?

谢谢你的帮助。

您没有告诉 Python 返回类型,所以它猜测它是int ,错误地,因此从错误的位置读取返回值(假设您在 x86-64 上,它从eax而不是xmm0 )并解释它错了。 print(entropy.entropy(p,n))之前执行entropy.entropy.restype = ctypes.c_float

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM