Цикл массива Truth в python и замена истинных значений компонентами из другого массива - PullRequest
3 голосов
/ 02 июля 2019

Допустим, у меня есть массив истинности массива Numpy, который выглядит примерно так:

truths = [True, False, False, False, True, True]

, и у меня есть еще один массив значений, который выглядит примерно так:

nums = [1, 2, 3]

IЯ хочу создать цикл, который заменит все значения истинности в массиве истинности следующим числом из массива nums и заменит все значения False на 0.

Я хочу получить что-то похожее на:

array = [1, 0, 0, 0, 2, 3]

Ответы [ 3 ]

3 голосов
/ 02 июля 2019

Я бы порекомендовал 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 в некоторый логический массив, где я могу сделать это простое преобразование, но может быть лучший способ.

2 голосов
/ 02 июля 2019

Вы можете использовать cycle из itertools для циклического просмотра списка nums.Затем просто заархивируйте его с помощью ваших логических значений и используйте понимание троичного списка.

from itertools import cycle  

>>> [num if boolean else 0 for boolean, num in zip(truths, cycle(nums))]
[1, 0, 0, 0, 2, 3]
1 голос
/ 02 июля 2019

Вы можете использовать itertools здесь, как вы сказали, что хотите цикл.

from itertools import cycle, chain, repeat
import numpy as np

truths = np.array([True, False, False, False, True, True])
nums = np.array([1, 2, 3])

#you have 2 options here.
#Either repeat over nums
iter_nums = cycle(nums)
#or when nums is exhausted
#you just put default value in it's place
iter_nums = chain(nums, repeat(0))

masked = np.array([next(iter_nums) if v else v for v in truths])
print(masked)
#[1, 0, 0, 0, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...