Как организован массив numpy в памяти? - PullRequest
1 голос
/ 09 июня 2011

Я пытаюсь получить некоторые данные из модуля, который является общим объектом, обернутым в ctypes.Данные представляют собой числовой массив, поэтому я использовал массив NumPy для хранения данных.Но я узнал, что я не понимаю, как numpy организует массив в памяти.

Если бы у меня была функция C, которая бы заполняла массив, как показано ниже:

int filler(int* a,int length){
        int i=0;
        for(i=0;i<length;i++){
                a[i]=i;
        }
        return 0;
}

Тогда я бы вызвалэта функция в python с использованием ctypes

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-битные (GCC в openSUSE на машине Intel x86).Я попытался запустить dtypes с 32 битами, и, как ни странно, я получил желаемый результат:

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]]

Я посмотрел, посмотрел на обалденные документы, но до сих пор не нашел ответ.

1 Ответ

2 голосов
/ 09 июня 2011

Это имело бы смысл, если бы int был 32 немного, но я полагаю, что C int 16 бит (GCC в openSUSE в Intel x86 машина). Я пробовал работать с dtypes будучи 32 битами и странным образом я получаю результат, который я хочу:

Совсем не странно: ваше предположение неверно, и ваша машина 32-битная с 32-битным int и 16-битным коротким int ... если вы не выполняете (весьма примечательные) ретро-вычисления!

Проверьте sizeof (int) и умножьте на 8, или просто сохраните числа в int и распечатайте их, чтобы убедить себя.

...