Tôi đang cố gắng viết một số mã cython để thực hiện tính toán với mảng có nhiều mảng. Cython dường như không thích [] được sử dụng trong tất cả các ví dụ mà tôi đã thấy để xác định kiểu dữ liệu và số thứ nguyên.sử dụng numpy trong cython: xác định ndarray datatype/ndims
Ví dụ, tôi có một test.pyx file:
cimport numpy as np
import numpy as np
ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix
cpdef mymatrix hat (mymatrix x):
a = np.zeros((3,3));
a[0,1] = x[2,0];
a[0,2] = -x[1,0];
a[1,2] = x[0,0];
a[1,0] = -x[2,0];
a[2,0] = x[1,0];
a[2,1] = -x[0,0];
return a;
tôi biên dịch này sử dụng một setup.py (xem cuối bài), mà tôi chạy với "python setup.py build_ext --inplace "
tôi nhận được kết quả như sau:
running build_ext
cythoning test.pyx to test.c
Error converting Pyrex file to C:
------------------------------------------------------------
...
cimport numpy as np
import numpy as np
ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix
^
------------------------------------------------------------
test.pyx:4:42: Syntax error in ctypedef statement
<snip, irrelevant>
trong khi nếu tôi loại bỏ các "[np.float64_t, ndim = 2]" một phần, nó hoạt động tốt.
Có ai có ý tưởng nào không?
Như để thiết lập hệ thống của tôi: Hệ điều hành: Windows XP
đầy đủ, hoàn chỉnh cài đặt pythonxy, phiên bản 2.6.5.1 (mới nhất tại thời điểm này)
pythonxy được cho là đi kèm với cython, nhưng tôi đã kết thúc cài đặt cython phiên bản 0.12.1 cho Python 2.6 từ trang web này: http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython
Tôi nghi ngờ rằng bằng cách nào đó tôi đang thiếu một đường dẫn hoặc một cái gì đó: Tôi đã giải quyết một số vấn đề bằng cách thêm rõ ràng thư mục tệp tiêu đề sumpy vào đường dẫn bao gồm được sử dụng bởi mingw (xem tệp setup.py dưới đây)
ở đây là tập tin setup.py tôi đã đề cập:
from distutils.core import setup
from distutils.extension import Extension
from distutils.sysconfig import get_python_inc
from Cython.Distutils import build_ext
import os.path
inc_base = get_python_inc(plat_specific=1);
incdir = os.path.join(get_python_inc(plat_specific=1),);
#libraries=['math'],
ext_modules = [Extension("test",
["test.pyx"],
include_dirs = [
os.path.join(inc_base,'..\\Lib\\site-packages\\numpy\\core\\include\\numpy'),
]
)
]
setup(
name = 'test',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
Ý anh là gì bởi, 'trong khi nếu tôi loại bỏ các "[np.float64_t, ndim = 2 ] "một phần, nó hoạt động tốt."? Bạn chỉ cần thay thế 'mymatrix' bằng' np.ndarray [np.float64_t, ndim = 2' ở hai vị trí xảy ra? –
Tôi không nghĩ rằng bạn có thể sử dụng giao diện đệm với ctypedef. Bạn phải khai báo nó mỗi lần với cdef. – carl