Python 使用布尔筛选创建数组

Python 使用布尔筛选创建数组,python,pandas,numpy,Python,Pandas,Numpy,这可能是一个非常简单的问题,但我不知道python最好的方法是什么 假设我有一个数组a和filter_数组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] 非常感谢看起来您希望元素之间有一个空白字符

这可能是一个非常简单的问题,但我不知道python最好的方法是什么

假设我有一个数组a和filter_数组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]


非常感谢

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

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

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

这是一个使用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]

可以使用NumPy掩码阵列:

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

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

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

您可以用“无”替换任何要放在逗号中的内容

,因为您没有提到要在数组中存储的内容,因为它为False。所以我隐式地存储,即空字符串


如果要存储不同的内容来代替空字符串,则将值指定给replaceBy

您的问题有点难以解释,但看起来您希望通过使用布尔列表或数组作为掩码将一个NumPy数组转换为另一个NumPy数组。这可以通过一次调用np.where来完成



数组还是列表?你希望逗号之间是什么?[1,5,6,8,]在pythonSorry中是无效语法,我不知道它是无效的,当它为false时,我只想要nothing,所以NaN或没有nothing之类的东西,你必须明确表示你想要的是字符串数组还是数字数组。我现在明白了,即使None本身也会在屏幕上输出“None”,所以我应该为这个“nothing”决定一些东西。我相信空字符串最适合这种情况。这些甚至不是数组。@DYZ-oh-wow它的numpy数组。。。smhIt不清楚OP要求什么。它们有一个numpy标记,但数组看起来像列表。它们所显示的预期输出在Python中是非法的。等待澄清总是一个好主意。@DYZ是的,我只是看了看并假设了一下,但你知道他们说如果你假设你用“你”和“我”做了一个“屁股”:很抱歉,我不知道这是无效的,因为我不知道我能得到什么,NaN或其他什么。不管怎样,现在有一些解决方案,但它们都会导致相同的警告设置与CopyWarning当我在现有数据帧上创建一个新列时,您能给出一些建议来清除它吗*我按照建议尝试了.loc,但得到了相同的警告!精彩的Python是一种如此美丽的语言!我不知道我能用。在这种情况下,谢谢你精确的回答!然而,有了这段代码Work[Result]=pd.np.whereFilter,Work.Time,我实际上收到了一个警告,SettingWithCopyWarning,一个值正试图在数据帧的切片副本上设置。尝试改用.loc[row\u indexer,col\u indexer]=value,我不想忽略它。Work[Result]是我在调用此行时创建的一个新列,因此它以前不存在。我不太明白链式分配在这里是如何工作的,我也尝试在分配给Work[Result]之前为本地副本使用一个临时变量,但结果是一样的。嗯。。。我不确定,因为在那种情况下,我没有得到CopyWarning的设置,我只是编了一个数据框来检查。但是对于您正在尝试做的事情,您也可以尝试:Work.loc[Filter,'Result']=Work.Time,然后是Work.Result.fillna,inplace=truel我仍然收到这个警告,我认为当我试图从现有的Work DataFramework创建这个新列'Result'时会出现问题,因此在没有看到您的代码的情况下,诊断起来有点困难,但我最好的猜测是,工作是某种东西的复制品。您是在代码中的其他地方使用loc获得的吗?有关如何使用CopyWarning处理设置的详细概述,请参阅“非常感谢”!我需要做一些挖掘来理解这个代码的操作。无论如何,我已经使用它在现有工作数据框架上创建了一个新列,Work[Result]=np.ma.arrayWork.Time,mask=np.invertFilter,并且我得到了设置WithCopyWarning的警告,*我按照建议尝试了.loc,但得到了相同的警告!我相信当我创建列结果时会出现问题,请问我可以做些什么来清除它?您可以尝试使用值为true的mask之后的关键字copy吗,即…,copy=true?谢谢您的解决方案。我应该清楚地说明当为False时结果应该是什么,因为我实际上不清楚我可以有什么选择,要么是NaN,要么是使用string ie。使用try/except可以轻松提取信息
c = [a if f[i] else None for i, a in enumerate(a)]
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, '']
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])