Вычисление условных вероятностей от совместных ПМФ в NumPy, слишком медленно. Идеи? (Python-NumPy)
У меня есть массив функций массовой конъюнктивной вероятности, например, с формой (1,2,3,4,5,6), и я хочу вычислить таблицу вероятностей, условную для значения для некоторых измерений (экспортируйте cpts) для принятия решений.
Код, который я придумал на данный момент, следующий (входные данные - это словарь "vdict" в форме {'variable_1': value_1, 'variable_2': value_2...})
for i in vdict:
dim = self.invardict.index(i) # The index of the dimension that our Variable resides in
val = self.valdict[i][vdict[i]] # The value we want it to be
d = d.swapaxes(0, dim)
**d = array([d[val]])**
d = d.swapaxes(0, dim)
...
Итак, что я сейчас делаю:
- Я перевожу переменные в соответствующее измерение в cpt.
- Я меняю нулевую ось на ту, которую я нашел раньше.
- Я заменяю всю ось 0 только желаемым значением.
Я вернул размер к исходной оси.
Теперь проблема в том, чтобы выполнить шаг 2, я должен (a.) Вычислить подмассив и (b.) Поместить его в список и перевести его снова в массив, чтобы у меня был новый массив.
Дело в том, что жирный шрифт означает, что я создаю новые объекты, вместо того, чтобы использовать только ссылки на старые, и это, если d очень большой (что происходит со мной), и методы, которые используют d, вызываются много раз (что, опять же,, случается со мной) весь результат очень медленный.
Итак, кто-нибудь придумал идею, которая возвысит этот маленький кусочек кода и будет работать быстрее? Может быть, что-то, что позволит мне рассчитать условия на месте.
Примечание: я должен поддерживать исходный порядок осей (или, по крайней мере, быть уверенным в том, как обновить переменную до словарей измерений при удалении оси). Я бы не хотел прибегать к обычным типам.
1 ответ
Хорошо, нашел ответ сам после того, как немного поиграл с манипуляциями с массивами на месте.
Изменены последние 3 строки в цикле:
d = conditionalize(d, dim, val)
где conditionalize определяется как:
def conditionalize(arr, dim, val):
arr = arr.swapaxes(dim, 0)
shape = arr.shape[1:] # shape of the sub-array when we omit the desired dimension.
count = array(shape).prod() # count of elements omitted the desired dimension.
arr = arr.reshape(array(arr.shape).prod()) # flatten the array in-place.
arr = arr[val*count:(val+1)*count] # take the needed elements
arr = arr.reshape((1,)+shape) # the desired sub-array shape.
arr = arr. swapaxes(0, dim) # fix dimensions
return arr
Это уменьшило время выполнения моей программы с 15 до 6 секунд. Огромный выигрыш.
Я надеюсь, что это помогает кому-то, кто сталкивается с той же проблемой.