マウス胚の顕微鏡画像を着色するときchoose
、選択肢の数が数百(数百のマウス胚細胞)である実装の必要性に遭遇しました。
https://github.com/flatironinstitute/mouse_embryo_labeller
上記の提案が一般的であるか速いかわからなかったので、私はこの代替案を書きました:
import numpy as np
def big_choose(indices, choices):
"Alternate to np.choose that supports more than 30 choices."
indices = np.array(indices)
if (indices.max() <= 30) or (len(choices) <= 31):
# optimized fallback
choices = choices[:31]
return np.choose(indices, choices)
result = 0
while (len(choices) > 0) and not np.all(indices == -1):
these_choices = choices[:30]
remaining_choices = choices[30:]
shifted_indices = indices + 1
too_large_indices = (shifted_indices > 30).astype(np.int)
clamped_indices = np.choose(too_large_indices, [shifted_indices, 0])
choices_with_default = [result] + list(these_choices)
result = np.choose(clamped_indices, choices_with_default)
choices = remaining_choices
if len(choices) > 0:
indices = indices - 30
too_small = (indices < -1).astype(np.int)
indices = np.choose(too_small, [indices, -1])
return result
一般化された関数は、可能な場合は基礎となる実装を使用することに注意してください。