У меня есть проблема с присвоением значения логической маски, требующая эффективной операции с логической маской.
Это многомерная маска, и я использую einsum
для достижения результата, но операция не очень эффективна, и мне интересно, смогу ли я получить некоторую помощь в этом
Вот мое текущее решение: (оба mask, truth_value, false_value
являются фиктивными данными с типом dtype и формой, соответствующими моей проблеме.
mask = np.random.randn(1000, 50)> 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = np.einsum('ij,jk->ijk', mask, truth_value) + np.einsum('ij,k->ijk', ~mask, false_value)
Есть ли какой-нибудь более быстрый способ добраться objective
подаренный mask, truth_value, false_value
?
Пока я ждал, придумал более быстрый способ
objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value, (1000, 50, 10)))
Но есть ли более быстрая альтернатива ?
einsum
решение! немного быстрее, чем мойnp.where
+np.broadcast_to
решение на основе.