2012-06-12 39 views
15

Truyền mảng dumppe np.float64_t hoạt động tốt (bên dưới), nhưng tôi không thể chuyển mảng chuỗi.Làm thế nào để vượt qua một loạt các chuỗi các loại chuỗi đến một hàm trong Cython

Đây là những gì hoạt động:

# cython_testing.pyx 
import numpy as np 
cimport numpy as np 

ctypedef np.float64_t dtype_t 

cdef func1 (np.ndarray[dtype_t, ndim=2] A): 
    print A 

def testing(): 
    chunk = np.array ([[94.,3.],[44.,4.]], dtype=np.float64) 

    func1 (chunk) 

Nhưng tôi không thể làm cho công việc này: tôi không thể tìm thấy phù hợp 'định danh loại' cho dtypes chuỗi NumPy.

# cython_testing.pyx 
import numpy as np 
cimport numpy as np 

ctypedef np.string_t dtype_str_t 

cdef func1 (np.ndarray[dtype_str_t, ndim=2] A): 
    print A 

def testing(): 
    chunk = np.array ([['huh','yea'],['swell','ray']], dtype=np.string_) 

    func1 (chunk) 

Các lỗi biên dịch là:

Error compiling Cython file: 
------------------------------------------------------------ 
ctypedef np.string_t dtype_str_t 
    ^
------------------------------------------------------------ 

cython_testing.pyx:9:9: 'string_t' is not a type identifier 

CẬP NHẬT

mỗi nhìn qua numpy.pxd, tôi thấy ctypedef câu sau đây. Có lẽ đó là đủ để nói rằng tôi có thể sử dụng uint8_t và giả vờ tất cả mọi thứ là bình thường, miễn là tôi có thể làm một số đúc?

ctypedef unsigned char  npy_uint8 
ctypedef npy_uint8  uint8_t 

Chỉ cần xem mức độ tốn kém mà quá trình truyền sẽ diễn ra.

Trả lời

7

Có vẻ như bạn đã hết may mắn.

http://cython.readthedocs.org/en/latest/src/tutorial/numpy.html

Một số kiểu dữ liệu chưa được hỗ trợ, như mảng boolean và mảng chuỗi.


Câu trả lời này không còn giá trị được thể hiện bằng câu trả lời Saullo Castro, nhưng tôi sẽ để lại nó cho mục đích lịch sử.

+0

Cảm ơn. Tôi upvoted câu trả lời của bạn. Mặc dù tôi hy vọng có một công việc xung quanh bằng cách sử dụng mảng Numpy Structured [http://docs.scipy.org/doc/numpy/user/basics.rec.html#structured-arrays]. Nhưng tôi vẫn đang tìm cách vượt qua một trong số đó. – HeyWatchThis

+1

Ít nhất với mục đích của tôi, sử dụng cProfile, có vẻ như bạn vẫn có thể truyền mảng Numpy bằng cách gõ, trong Cython. Nhưng bạn không nhận được tối ưu hóa Cython được mô tả trong tài liệu tham khảo readthedocs.org của bạn. – HeyWatchThis

+1

Có thể sử dụng chúng từ từ vẫn tốt hơn là không thể sử dụng chúng ở tất cả, mặc dù, phải không? – JAB

6

Với Cython 0.20.1 nó hoạt động sử dụng cdef np.ndarray, mà không chỉ định kiểu dữ liệu và số lượng kích thước:

import numpy as np 
cimport numpy as np 

cdef func1(np.ndarray A): 
    print A 

def testing(): 
    chunk = np.array([['huh','yea'], ['swell','ray']]) 
    func1(chunk) 
+0

@TedPetrou Tôi đang cố gắng xây dựng một ví dụ trong đó 'dtype = object' sẽ tăng tốc để cập nhật câu trả lời, nhưng đến giờ tôi thấy nó tương đương với việc không chỉ định' dtype'. Bạn đo tốc độ 100x như thế nào? –

+0

Có vẻ như tôi đã bỏ lỡ một cách ồ ạt trong bình luận trước của tôi. Có vẻ như tôi đang cải thiện 5x bằng cách thay đổi đối tượng. Sử dụng mảng này. 'a = np.array (['một số', 'chuỗi', 'trong', 'an', 'mảng'] * 10 ** 5)' –

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