Я бы порекомендовал numpy.putmask()
.Так как мы конвертируем из типа bool
в int64
, нам нужно сначала выполнить некоторые преобразования.
Сначала инициализация:
truths = np.array([ True, False, False, False, True, True])
nums = np.array([1, 2, 3])
Затем мы конвертируем и заменяем на основе нашегомаска (если элемент truth
равен True):
truths = truths.astype('int64') # implicitly changes all the "False" values to 0
numpy.putmask(truths, truths, nums)
Конечный результат:
>>> truths
array([1, 0, 0, 0, 2, 3])
Обратите внимание, что мы просто передаем truths
в аргумент "mask"numpy.putmask()
.Это просто проверит, является ли каждый элемент массива truths
правдивым;поскольку мы преобразовали массив в тип int64
, он заменит только те элементы, которые НЕ равны 0, как требуется.
Если бы мы хотели быть более педантичными или нам нужно было заменить какое-то произвольное значение, нам нужно было бы вместо этого numpy.putmask(truths, truths==<value we want to replace>, nums)
.
Если мы хотим пойти ДАЖЕ более педантично и не делать предположения, что мы можем легко конвертировать типы (как мы можем от bool
до int64
), насколько я знаю, мы былибо нужно сделать какое-то отображение на другой numpy.array
, где мы могли бы сделать это преобразование.Я лично сделал бы так, чтобы преобразовать мой numpy.array
в некоторый логический массив, где я могу сделать это простое преобразование, но может быть лучший способ.