Существует намного лучший способ сделать это.Давайте посмотрим, что делает ваш код, чтобы понять, почему.
np.where
принимает три массива в качестве входных данных.Массивы не поддерживают отложенную оценку.
d = np.where(c >= 0, np.sqrt(c), c)
Следовательно, эта строка эквивалентна выполнению
a = (c >= 0)
b = np.sqrt(c)
d = np.where(a, b, c)
Обратите внимание, что входные данные вычисляются немедленно, прежде чем where
когда-либо будет вызван.
К счастью, вам вообще не нужно использовать where
.Вместо этого просто используйте логическую маску:
mask = (c >= 0)
d = np.empty_like(c)
d[mask] = np.sqrt(c[mask])
d[~mask] = c[~mask]
Если вы ожидаете много негативов, вы можете скопировать все элементы вместо только негативных:
d = c.copy()
d[mask] = np.sqrt(c[mask])
Еще лучшеРешением может быть использование замаскированных массивов:
d = np.ma(c, c < 0)
d = np.ma.sqrt(d)
Чтобы получить доступ ко всему массиву данных с неизмененной замаскированной частью, используйте d.data
.