如何在内存中组织numpy数组?

时间:2011-06-09 07:58:20

标签: memory numpy ctypes

我试图从一个模块中获取一些数据,该模块是用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,但到目前为止我还没找到答案。

1 个答案:

答案 0 :(得分:2)

  

如果int为32,这将有意义   bit,但我想C int是16位   (在x86 intel中的openSUSE中的GCC   机)。我尝试用dtypes运行   是32位,奇怪的是我得到了   结果我想要:

一点也不奇怪:你的假设是错误的,你的机器是32位的32位int和16位短的int ..除非你做了一些(相当令人钦佩的)逆向计算!

检查sizeof(int)并乘以8,或者只是将数字存储在int中并打印出来,以说服自己。