Примеры создания пользовательских типов numpy с помощью < здесь:
Кроме того, возможно для создания пользовательских ufuncs в cython:
Похоже, что также возможно создать dtype с использованием cython (а затем создать для него пользовательские ufunc). Является ли это возможным? Если да, можете ли вы отправить пример?
ИСПОЛЬЗОВАТЬ СЛУЧАЙ:
Я хочу провести анализ выживаемости. Основными элементами данных являются время выживания (поплавки) со связанными цензорами (False, если связанное время представляет собой время отказа и True, если вместо этого оно представляет собой время цензуры (т.е. Ни один сбой не произошел в течение периода наблюдения)).
Очевидно, я мог бы использовать два массива numpy для хранения этих значений: массив float для времени и массив bool для значений цензуры. Тем не менее, я хочу учитывать возможность события, происходящего несколько раз (это хорошая модель, например, для сердечных приступов - у вас может быть более одного). В этом случае мне нужен массив объектов, который я называю MultiEvent
s. Каждый MultiEvent
содержит последовательность поплавков (время без цензуры) и период наблюдения (также плавающий). Обратите внимание, что количество ошибок не одинаково для всех MultiEvent
s.
Мне нужно выполнить несколько операций над массивом MultiEvent
s:
-
Получите количество отказов для каждого
-
Получить время с цензурой (то есть период наблюдения минус сумма всех времен отказа)
-
Рассчитайте логарифмическое правдоподобие на основе дополнительных массивов параметров (таких как массив значений опасности). Например, логарифмическая вероятность для одного
MultiEvent
M
и значения постоянной опасностиh
будет выглядеть примерно так:sum(log(h) + h*t for t in M.times) - h*(M.period - sum(M.times))
где M.times
- это список (массив, независимо) времени сбоя и M.period
- общий период наблюдения. Я хочу, чтобы правильные правила широковещания были применены, чтобы я мог:
log_lik = logp(M_vec,h_vec)
и он будет работать до тех пор, пока размеры M_vec
и h_vec
совместимы.
В моей текущей реализации используется numpy.vectorize
. Это работает достаточно хорошо для 1 и 2, но это слишком медленно для 3. Обратите внимание также, что я не могу сделать этот, потому что количество отказов в моих объектах MultiData неизвестно заранее.