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