У меня есть конъюнктивный массив масс масс масс, с формой, например (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)
...
Итак, что я сейчас делаю:
Я вернул размер обратно к исходной оси.
Теперь проблема заключается в том, чтобы сделать шаг 2, у меня есть (a.) для вычисления подмассива и (b.), чтобы поместить его в список и перевести его снова в массив, чтобы у меня появился новый массив.
Вещь, жирный шрифт означает, что я создаю новые объекты, вместо того, чтобы использовать только ссылки на старые и это, если d очень велико (что происходит со мной), а методы, которые используют d, вызываются много раз ( что, опять же, со мной), весь результат очень медленный.
Итак, кто-нибудь придумал идею, которая будет обрабатывать этот маленький кусочек кода и будет работать быстрее? Может быть, что-то, что позволит мне рассчитать условные условия.
Примечание. Я должен поддерживать исходный порядок оси (или, по крайней мере, быть уверенным в том, как обновлять переменную до словарей размеров при удалении оси). Я бы не хотел прибегать к пользовательским типам.
Хорошо, сам нашел ответ, немного поиграв с многократными манипуляторами на месте.
Изменены последние три строки в цикле:
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 секунд. Огромная прибыль.
Я надеюсь, что это поможет кому-то, кто сталкивается с той же проблемой.