使用布尔过滤创建数组

时间:2018-09-21 23:10:13

标签: python pandas numpy

这可能是一个非常简单的问题,但是我不知道什么是最好的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,"" ]

*假的时候我要“”

我怎么能得到c?请注意,我不想[1,5,6,8]

非常感谢

6 个答案:

答案 0 :(得分:3)

您似乎希望元素之间有一个空白字符串,这意味着最后是一个字符串数组。如果是这样,您可以执行以下操作:

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

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

答案 1 :(得分:1)

这是使用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, '']

答案 2 :(得分:1)

还有另一个使用列表理解的答案:

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

(而且您可以用None替换要用逗号分隔的内容)

答案 3 :(得分:1)

因为您没有提到要在数组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

答案 4 :(得分:1)

您的问题有点难以解释,但看起来您想通过使用布尔列表或数组作为掩码将一个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])

答案 5 :(得分:0)

您可以使用NumPy掩码数组:

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