Có những ví dụ để tạo dtypes tùy chỉnh NumPy sử dụng C here:Làm thế nào để tạo ra một tùy chỉnh NumPy dtype sử dụng cython
Ngoài ra, nó seems to be possible để tạo ufuncs tùy chỉnh trong cython:
Nó có vẻ như nó cũng phải được có thể tạo một dtype bằng cách sử dụng cython (và sau đó tạo ufuncs tùy chỉnh cho nó). Có thể không? Nếu có, bạn có thể đăng một ví dụ không?
SỬ DỤNG TRƯỜNG HỢP:
Tôi muốn thực hiện một số phân tích sinh tồn. Các phần tử dữ liệu cơ bản là các thời gian tồn tại (float) với các giá trị kiểm duyệt liên quan (False nếu thời gian liên quan biểu thị thời gian lỗi và True nếu nó thay thế là thời gian kiểm duyệt (tức là không xảy ra lỗi trong thời gian quan sát)).
Rõ ràng tôi chỉ có thể sử dụng hai mảng cố định để lưu trữ các giá trị này: mảng nổi cho thời gian và mảng bool cho giá trị kiểm duyệt. Tuy nhiên, tôi muốn tính đến khả năng xảy ra một sự kiện nhiều lần (đây là một mô hình tốt cho, nói rằng, cơn đau tim - bạn có thể có nhiều hơn một). Trong trường hợp này, tôi cần một mảng các đối tượng mà tôi gọi là MultiEvent
s. Mỗi MultiEvent
chứa một chuỗi các phao (thời gian lỗi không kiểm duyệt) và một khoảng thời gian quan sát (cũng là một phao). Lưu ý rằng số lần thất bại không giống nhau đối với tất cả các số MultiEvent
s.
tôi cần để có thể thực hiện một vài thao tác trên một loạt các MultiEvent
s:
Lấy số thất bại cho mỗi
Lấy thời gian kiểm duyệt (có nghĩa là giai đoạn quan sát trừ tổng của tất cả các lần thất bại)
Tính khả năng nhật ký dựa trên mảng tham số bổ sung (chẳng hạn như một mảng giá trị nguy hiểm). Ví dụ, khả năng log cho một đơn
MultiEvent
M
và liên tục giá trị rủi roh
sẽ là một cái gì đó như:sum(log(h) + h*t for t in M.times) - h*(M.period - sum(M.times))
nơi M.times
là danh sách (mảng, bất cứ điều gì) lần thất bại và M.period
là tổng thời gian quan sát. Tôi muốn các quy tắc phát sóng NumPy thích hợp để áp dụng, vì vậy mà tôi có thể làm:
log_lik = logp(M_vec,h_vec)
và nó sẽ làm việc miễn là kích thước của M_vec
và h_vec
tương thích.
Triển khai hiện tại của tôi sử dụng numpy.vectorize
. Điều đó hoạt động tốt đủ cho 1 và 2, nhưng nó quá chậm cho 3. Lưu ý rằng tôi không thể làm this vì số lần thất bại trong các đối tượng MultiData của tôi không được biết trước.
Lý do bạn hỏi vì bạn thấy viết cython đơn giản hơn viết C? Tôi nghi ngờ rằng nếu nó có thể (mà tôi không biết), bạn sẽ kết thúc với mã đó chỉ là phức tạp và lộn xộn như C, vì vậy có thể không có bất kỳ lợi ích. – DaveP
@DaveP Có hai lý do. Một là tôi tìm thấy nó đơn giản hơn để viết trong cython hơn C. Khác là tôi muốn làm cho quá trình này dễ dàng cho các lập trình python để lặp lại cho dtypes mới và ufuncs. Tôi hy vọng rằng tôi có thể quấn hầu hết các phức tạp và làm cho dtypes xác định một điều đơn giản để làm trong cython. Điều đó nói rằng, cython là thứ mà tôi chỉ học được vào tuần trước. Tôi đã chơi với nó, nhưng vào thời điểm này tôi không hoàn toàn hiểu được khả năng của nó. – jcrudy
Thật tuyệt khi có trường hợp sử dụng để chúng tôi có thể giúp bạn – jlengrand