我试图从一个模块中获取一些数据,该模块是用ctypes包装的共享对象。 数据是一个数字数组,所以我使用numpy数组来存储数据。但我了解到了我 不明白numpy如何在内存中组织数组。
如果我有一个C函数,它将填充如下所示的数组:
int filler(int* a,int length){
int i=0;
for(i=0;i<length;i++){
a[i]=i;
}
return 0;
}
然后我将使用ctypes
在python中调用此函数import ctypes
import numpy
lib = ctypes.cdll.LoadLibrary("libname")
data = numpy.zeros((1,10),dtype=numpy.int16)
lib.filler(data.ctypes.data,ctypes.c_int(10))
print data
但我的输出是这样出来的。
dtype=numpy.int16
[[0 0 1 0 2 0 3 0 4 0]]
如果int是32位,这是有意义的,但我认为C int是16位(x86 intel机器中的openSUSE中的GCC)。 我尝试使用32位的dtypes运行,奇怪的是我得到了我想要的结果:
dtype=numpy.int32
[[0 1 2 3 4 5 6 7 8 9]]
试着弄清楚我用int8运行的是什么,我得到了以下内容:
dtype=numpy.int8
[[0 0 0 0 1 0 0 0 2 0]]
我确实看了看numpy docs,但到目前为止我还没找到答案。
答案 0 :(得分:2)
如果int为32,这将有意义 bit,但我想C int是16位 (在x86 intel中的openSUSE中的GCC 机)。我尝试用dtypes运行 是32位,奇怪的是我得到了 结果我想要:
一点也不奇怪:你的假设是错误的,你的机器是32位的32位int和16位短的int ..除非你做了一些(相当令人钦佩的)逆向计算!
检查sizeof(int)并乘以8,或者只是将数字存储在int中并打印出来,以说服自己。