2012-11-02 33 views
24

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:

  1. Lấy số thất bại cho mỗi

  2. 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)

  3. 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 MultiEventM và liên tục giá trị rủi ro h 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_vech_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.

+1

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

+2

@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

+0

Thật tuyệt khi có trường hợp sử dụng để chúng tôi có thể giúp bạn – jlengrand

Trả lời

0

Tôi xin lỗi vì đã không trả lời câu hỏi trực tiếp, nhưng tôi đã gặp vấn đề tương tự trước đây, và nếu tôi hiểu chính xác, vấn đề thực sự bạn đang gặp phải là bạn có dữ liệu có độ dài thay đổi không phải là một trong những điểm mạnh của sự uể oải, và là lý do bạn đang chạy vào các vấn đề hiệu suất.Trừ khi bạn biết trước số lượng mục nhập tối đa cho một multievent, bạn sẽ có vấn đề, và thậm chí sau đó bạn sẽ lãng phí vô số bộ nhớ/không gian đĩa chứa đầy số không cho những sự kiện không phải là nhiều sự kiện.

Bạn có các điểm dữ liệu có nhiều trường, một số trường có liên quan đến các trường khác và một số trường cần được xác định theo nhóm. Điều này gợi ý mạnh mẽ rằng bạn nên xem xét một cơ sở dữ liệu của một số hình thức để lưu trữ thông tin này, cho hiệu suất, bộ nhớ, không gian trên đĩa và lý do sanity.

Sẽ dễ dàng hơn cho một người mới đối với mã của bạn để hiểu giản đồ cơ sở dữ liệu đơn giản hơn cấu trúc phức tạp, bị hack trên nền tảng sẽ chậm và bực dọc. Các truy vấn SQL nhanh chóng và dễ dàng để viết so sánh.

Tôi sẽ đề xuất dựa trên sự hiểu biết của bạn về giải thích của bạn có các bảng Sự kiện và MultiEvent, trong đó mỗi mục Sự kiện có khóa ngoại vào bảng MultiEvent nếu có liên quan.

+0

Vấn đề với giải pháp này là tôi không thể sử dụng bộ sưu tập lớn các công cụ đã được xây dựng trên đầu trang của numpy. Một phần mở rộng của câu trả lời này sẽ là tạo ra một mảng numpy (hoặc một DataFrame gấu trúc) dựa trên sự kết hợp giữa bảng MultiEvent của tôi và bảng giữ các biến vô hướng của tôi. Tuy nhiên, với mục đích của tôi (sử dụng một tập hợp các mô hình pymc cụ thể), điều đó cũng không may là một lựa chọn. – jcrudy

+0

@ user1572508 bạn đã xem xét một cái gì đó như [PyTables] (http://www.pytables.org/moin)? – jozzas

1

Mảng cố định phù hợp nhất cho các loại dữ liệu có kích thước cố định. Nếu các đối tượng trong mảng không có kích thước cố định (chẳng hạn như MultiEvent), các hoạt động có thể trở nên chậm hơn nhiều.

Tôi khuyên bạn nên lưu trữ tất cả thời gian tồn tại trong mảng bản ghi tuyến tính 1d với 3 trường: event_id, time, period. Mỗi sự kiện có thể xuất hiện lần mutliple trong mảng:

>>> import numpy as np 
>>> rawdata = [(1, 0.4, 4), (1, 0.6, 6), (2,2.6, 6)] 
>>> npdata = np.rec.fromrecords(rawdata, names='event_id,time,period') 
>>> print npdata 
[(1, 0.40000000000000002, 4) (1, 0.59999999999999998, 6) (2, 2.6000000000000001, 6)] 

Để có được dữ liệu cho một chỉ số cụ thể mà bạn có thể sử dụng chỉ mục ưa thích:

>>> eventdata = npdata[npdata.event_id==1] 
>>> print eventdata 
[(1, 0.40000000000000002, 4) (1, 0.59999999999999998, 6)] 

Ưu điểm của phương pháp này là bạn có thể dễ dàng hòa nhập với các hàm dựa trên ndarray của bạn. Bạn cũng có thể truy cập mảng này từ cython như được mô tả trong manual:

cdef packed struct Event: 
    np.int32_t event_id 
    np.float64_t time 
    np.float64_6 period 

def f(): 
    cdef np.ndarray[Event] b = np.zeros(10, 
     dtype=np.dtype([('event_id', np.int32), 
         ('time', np.float64), 
         ('period', np.float64)])) 
    <...> 
Các vấn đề liên quan