Создание массива с использованием булевой фильтрации

108
11

Это может быть очень простой вопрос, но я не знаю, каков наилучший способ python.

Скажем, у меня есть массив a и filter_array f, я бы хотел создать массив c.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
f = [True, False, False, False, True, True, False, True, False]
c = [1,"" ,"" ,"" , 5, 6,"" , 8,"" ]

* Я хочу "", когда False

Как я могу получить c?? Заметьте, я не хочу [1,5,6,8]

Большое спасибо

спросил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
1
Решение
88

Похоже, вы хотите, чтобы между вашими элементами была пустая строка, что в конце концов означает массив строк. Если это так, вы можете сделать:

c = np.where(f,a,'')

>>> c
array(['1', '', '', '', '5', '6', '', '8', ''], dtype='<U21')

ответил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
62

Еще один ответ с использованием списка:

c = [a if f[i] else None for i, a in enumerate(a)]

(и вы можете заменить None на то, что вы хотите поместить в запятую)

ответил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
63

Ваш вопрос несколько сложно интерпретировать, но похоже, что вы хотите преобразовать один массив NumPy в другой массив NumPy, используя логический список или массив в качестве маски. Это можно сделать одним вызовом np.where.

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
f = [True, False, False, False, True, True, False, True, False]

np.where(f, a, np.nan)
#array([ 1., nan, nan, nan, 5., 6., nan, 8., nan])

ответил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
64

Это хорошее место для использования zip и оценки оттуда

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
f = [True, False, False, False, True, True, False, True, False]

x = list(zip(a, f))
c = [i[0] if i[1] == True else '' for i in x]

:~/python/stack$ python3.7 sum.py 
[1, '', '', '', 5, 6, '', 8, '']

ответил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
63

Поскольку вы не упомянули, что хотите сохранить в массиве, когда его False. Поэтому неявно я сохраняю '' т.е. пустую строку

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
f = [True, False, False, False, True, True, False, True, False]
replaceBy = "" # simply replaces by empty string if found false
c = [x if y else replaceBy for (x, y) in zip(a, f)]
print(c) # [1, '', '' ,'', 5, 6, '', 8, '']

Если вы хотите сохранить что-то другое вместо пустой строки, то присвойте значение replaceBy

ответил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
45

Маскированные массивы NumPy можно использовать:

import numpy as np
c = np.ma.array(a,mask=np.invert(f));

ответил(а) 2021-01-25T18:24:31+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема