У меня есть 1D "from" -array (назовите его " frm " ), содержащий значения со связанным массивом логических масок: " mask" (той же формы, что и от ). Затем у меня есть третий массив «replace»: " repl " , также 1D, но короче по длине, чем два других.
С их помощью я хотел бы создать новый массив ( " до " ), который содержит значения frm за исключением , где mask == True , в этом случае должно быть по порядку значения от repl . (Обратите внимание, что количество True элементов в mask равно длине repl ).
Я искал "умный" тупой способ реализации этого? Я посмотрел на такие методы, как np.where , np.take , np.select , np.choose , но ни один из них не подходит счет "?
«Обрезка по коду», вот что у меня есть до сих пор. Это работает нормально, но не кажется "Numpythonic"? (или даже Pythonic в этом отношении)
frm = [1, 2, 3, 4, 5]
mask = [False, True, False, True, True]
repl = [200, 400, 500]
i = 0; to = []
for f,m in zip(frm,mask):
if m:
to.append(repl[i])
i += 1
else:
to.append(f)
print(to)
Выход: [1, 200, 3, 400, 500]
( Справочная информация : причина, по которой мне нужно это сделать, заключается в том, что я создаю подклассы класса Pandas pd.Dataframe и мне нужен "установщик" для столбцов / индексов. Как pd.Index не может быть "индексирован по частям". Мне нужно сначала скопировать массив индекса / столбца, заменить некоторые элементы в копии на основе маски, а затем установить setter , чтобы установить Совершенно новое значение. Дайте мне знать, если кто-нибудь узнает более элегантное решение для этого).