【发布时间】:2021-12-31 16:07:33
【问题描述】:
我有一个布尔掩码值分配问题,需要有效的布尔掩码操作。
这是一个多维蒙版,我正在使用einsum来实现结果,但是操作效率不是很高,我想知道是否可以得到一些帮助
这是我目前的解决方案:(mask, truth_value, false_value 都是 dtype 和 shape 与我的问题匹配的虚拟数据。
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)
在给定mask, truth_value, false_value 的情况下,有没有更快的方法来获得objective?
在等待的时候,想出了一个更快的方法
objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value, (1000, 50, 10)))
但是有没有更快的选择?
【问题讨论】:
-
“更好”是什么意思?更快的方法?
-
是的,我的意思是更快的方式
-
我希望这会稍微快一点,但不会太多:
objective = np.einsum('ij,jk->ijk', mask, truth_value); objective[~mask, :] = false_value. -
看来这更好
objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value, (1000, 50, 10)))