2013-04-23 1 views
6

Как сделать пустые массивы numpy типа int в Cython? Следующие работы для меня для двойных или поплавковых массивов:Как инициализировать массивы numpy с фиксированными размерами в Cython?

# make array of size N of type float 
cdef np.ndarray[float, ndim=1] myarr = np.empty(N) 
# make array of size N of type int 
cdef np.ndarray[int, ndim=1] myarr = np.empty(N) 

Однако, если я пытаюсь сделать то же самое с междунар, он не:

# this fails 
cdef np.ndarray[np.int, ndim=1] myarr = np.empty(N) 
# wanted to set first element to be an int 
myarr[0] = 5 

дает ошибку:

ValueError : Несоответствие типа буфера, ожидаемое 'int', но получившее 'double'

Поскольку, видимо, np.empty() возвращает двойной. Я пробовал:

cdef np.ndarray[np.int, ndim=1] myarr = np.empty(N, dtype=int) 

, но он дает ту же ошибку. Как это может быть сделано?

ответ

6

Включить заявление

cimport numpy as np 

и объявить массив как, скажем, np.int32_t:

cdef np.ndarray[np.int32_t, ndim=1] myarr = np.empty(N, dtype=np.int32) 

Вы можете роняйте 32 из деклараций типа и использовать

cdef np.ndarray[np.int_t, ndim=1] myarr = np.empty(N, dtype=np.int) 

но я предпочитаю быть явным о размере элементов в numpy arr ау.

Обратите внимание, что я также добавил dtype к empty; стандартным значением dtype empty является np.float64.

+0

Почему это не работает с простым 'int' или просто' np.int' в отличие от 'np.int32_t'? – user248237dfsf

+1

Аргумент типа объявления ndarray должен быть C-типом, а не типом объекта Python. Если вы выкопаете в файл заголовка numpy cython 'numpy.pxd', вы обнаружите, что' np.int32_t' в конечном итоге приводит к объявлению 'signed int'. –

+0

Не могли бы вы объяснить, почему вы используете 'dtype = np.int', а не' dtype = np.int32_t' при вызове 'np.empty'? последний не работает – user248237dfsf

1

Wierd! У меня такая же ошибка, когда я пытался. Однако, глядя на сообщение об ошибке, я просто изменил область создания массива на функцию, и он компилируется! Я не знаю, почему это происходит, но.

import numpy as np 
cimport numpy as np 

ctypedef np.int_t DTYPE_t 
DTYPE=np.int 

def new_array(): 
    cdef int length = 10 
    cdef np.ndarray[DTYPE_t, ndim=1] x = np.zeros([length], dtype=np.int) 
    return x 

x = new_array() 

http://docs.cython.org/src/userguide/language_basics.html#python-functions-vs-c-functions Я думаю, что имеет какую-то информацию, связанную с обзорным питоном/с/смешанным переменными.

 Смежные вопросы

  • Нет связанных вопросов^_^