2016-08-19 3 views
-1

Попробуйте запустить пример 7-11 из High Performance PythonCython и NumPy

cython_np.pyx

#cython_np.pyx 
import numpy as np 
cimport numpy as np 
def calculate_z(int maxiter, double complex[:] zs, double complex[:] cs): 
    cdef unsigned int i, n 
    cdef double complex z, c 
    cdef int[:] output = np.empty(len(zs), dtype = np.int32) 
    for i in range(len(zs)): 
     n = 0 
     z = zs[i] 
     c = cs[i] 
     while n < maxiter and (z.real * z.real + z.imag * z.imag) < 4: 
      z = z * z + c 
      n += 1 
     output[i] = n 
    return output 

setup.py

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

setup(
     cmdclass = {'build_ext':build_ext}, 
     ext_modules = [Extension("calculate", ["cythonfn.pyx"])] 
) 

В терминале , ubuntu 16.04

python3 setup.py build_ext --inplace 

получить предупреждение

running build_ext 
cythoning cythonfn.pyx to cythonfn.c 
building 'calculate' extension 
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c cythonfn.c -o build/temp.linux-x86_64-3.5/cythonfn.o 
In file included from /usr/include/python3.5m/numpy/ndarraytypes.h:1777:0, 
       from /usr/include/python3.5m/numpy/ndarrayobject.h:18, 
       from /usr/include/python3.5m/numpy/arrayobject.h:4, 
       from cythonfn.c:274: 
/usr/include/python3.5m/numpy/npy_1_7_deprecated_api.h:15:2: warning:   #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] 
#warning "Using deprecated NumPy API, disable it by " \ 
^
In file included from /usr/include/python3.5m/numpy/ndarrayobject.h:27:0, 
       from /usr/include/python3.5m/numpy/arrayobject.h:4, 
       from cythonfn.c:274: 
/usr/include/python3.5m/numpy/__multiarray_api.h:1448:1: warning: ‘_import_array’ defined but not used [-Wunused-function] 
_import_array(void) 
^ 
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.5/cythonfn.o -o MY_DIR/calculate.cpython-35m-x86_64-linux-gnu.so 

, когда я пытаюсь запустить использование функции calculate.calculate.z в IPython, она говорит

TypeError: a bytes-like object is required, not 'list' 

detail of using calculate.z

Любая идея о предупреждение?

ответ

0

Я думаю, основываясь на примерах в http://docs.cython.org/en/latest/src/userguide/memoryviews.html

double complex[:] zs 

определяет 1d memoryview с double complex DTYPE. Это похоже на массив numpy с этим dtype.

Ваш код передает список этой функции. Списки представляют собой объекты Python и не могут быть доступны в качестве собственных массивов C или Cython.

Предоставляет ли ваш источник информацию о том, как вызвать эту функцию? У меня нет доступа к этой книге.

+0

В книге не говорится, как вызвать функцию. Я передаю ** numpy.array() ** объект для моей функции вместо объекта списка, когда я его вызываю. Он, наконец, работает, спасибо! – zpoint

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