2010-07-31 40 views
8

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 
) 
+0

Ý 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? –

+1

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

Trả lời

3

Đặt loại thông tin trong tờ khai của hàm, như trong:

def hat (ndarray[np.float64_t, ndim=2] x): 
    a = np.zeros((3,3)); 
    a[0,1] = x[2,0]; 
    etc. 
0

Tôi nghĩ rằng bạn không thể làm điều đó trực tiếp: bạn phải kiểm tra hình dạng và gõ vào chức năng

assert x.shape[0] == 2 
assert x.dtype == np.float64 

và chỉ cdeftype np.ndarray mymatrix trong tiêu đề

NHƯNG bạn đánh mất giá trị ma trận do đó bạn phải chỉ định mỗi giá trị bạn xử lý cho float64_t: nhưng hiệu quả là gì?

Louis

Các vấn đề liên quan