Вычисление условных вероятностей от совместных ПМФ в numy, слишком медленно. Идеи? (Python-NumPy)

1

У меня есть конъюнктивный массив масс масс масс, с формой, например (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, вызываются много раз ( что, опять же, со мной), весь результат очень медленный.

Итак, кто-нибудь придумал идею, которая будет обрабатывать этот маленький кусочек кода и будет работать быстрее? Может быть, что-то, что позволит мне рассчитать условные условия.

Примечание. Я должен поддерживать исходный порядок оси (или, по крайней мере, быть уверенным в том, как обновлять переменную до словарей размеров при удалении оси). Я бы не хотел прибегать к пользовательским типам.

Теги:
arrays
numpy
probability
recarray

1 ответ

1
Лучший ответ

Хорошо, сам нашел ответ, немного поиграв с многократными манипуляторами на месте.

Изменены последние три строки в цикле:

    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 секунд. Огромная прибыль.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню