Вычисление условных вероятностей от совместных ПМФ в 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)

...

Итак, что я сейчас делаю:

  1. Я перевожу переменные в соответствующее измерение в cpt.
  2. Я меняю нулевую ось на ту, которую я нашел раньше.
  3. Я заменяю всю ось 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 секунд. Огромный выигрыш.

Я надеюсь, что это помогает кому-то, кто сталкивается с той же проблемой.

Другие вопросы по тегам