【发布时间】:2019-11-24 01:12:52
【问题描述】:
我正在尝试为一个项目从多个数组中选择值,但在使用布尔值时遇到了问题。我有两个名为“zdat”和“photdat”的数据文件,每个文件有超过 5000 个值。我需要使用两者的质量标志将它们稀疏到一个新数组中。对于 zdat 文件,我需要标志为 3 或 4,所以我想我可以将其插入到 numpy.where 函数中,但我不断收到相同的错误:“具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()"。我查看了它们的作用,并尝试将它们添加到代码中以允许我使用 OR 语句,但我不断收到错误消息。 numpy.where 函数的其余部分在没有 or 语句的情况下工作,但我需要 or 语句来选择高质量的数据。
izspec = np.where(np.any(zdat['spec_z'] == 3 or 4) & (photdat['totmask'] == 0) & (photdat['K_flag'] == 0) & (goodmag < 23))
我希望它将我的数据从大约 5000 稀疏到大约 170ish(我被告知好的数据点的数量)。如果我将其设置为“zdat['spec_z'] == 3”或“zdat['spec_z'] == 4”,那么其中任何一个分别给我大约 60-80 分,但这些标志中的每一个都被认为是“好" 所以我两个都需要。
【问题讨论】:
-
一方面,请仔细查看
np.any(zdat['spec_z'] == 3 or 4) -
我对我应该寻找的东西感到困惑。我想从 zdat 文件中的“spec_z”列中选择等于 3 或 4 的值
-
通过使用
(zdat..)&(photodat...}&(....)创建一个布尔数组,您走在了正确的轨道上。只需将第一个or拆分为两个表达式,并用|连接。所有的工作都是使布尔值正确。np.where只是在结果布尔值中查找True值。 -
我相信你使用
np.where()的方式是不必要的,discouraged。如果要选择值,只需使用my_array[conditions]。 -
@AlexanderCécile,当我们的意思是
np.nonzero时,使用np.where的习惯会慢慢消失,如果有的话。无论如何,这不是问题所在。问题是如何正确构造包含or条件的布尔数组。 Python 甚至在调用where/nonzero之前就完整地评估了该参数。据我所知,直接使用布尔索引没有任何优势。