【问题标题】:Applying numpy masks with multiple matching criteria应用具有多个匹配条件的 numpy 掩码
【发布时间】:2021-09-17 23:27:23
【问题描述】:

我是一个 python 新手,试图了解如何更好地使用 numpy 掩码。 我有两个二维数据数组加上轴值,所以像

        import numpy as np 
        data1=np.arange(50).reshape(10,5)
        data2=np.random.rand(10,5)
        x=5*np.arange(5)+15
        y=2*np.arange(10)

其中 x 包含 data1 和 data2 的第 1 轴坐标,y 给出 data1 和 data2 的第 2 轴坐标。

我想识别和计算 data1 中的所有点

  1. data1>D1 分钟,
  2. 对应的 x 值在给定范围内,XRange 和
  3. 对应的 y 在给定的范围内,YRange

然后,当我全部完成后,我还需要进行检查以确保没有一个对应的 data2 值小于另一个限制 D2Max

如果

        XRange = [27,38]
        YRange = [2,12]
        D1min = 23
        D2Max = 0.8

我想在 x 方向包括单元格 3:4,在第二维包括 1:6(假设我想包括限制值)。

这意味着我只会考虑 data1[3:4,1:6] 那么二维数组中的值的限制就进入了,所以要识别和计算data1[3:4,1:6] > 23的点。

完成此操作后,我想获取 那些 数据位置并检查这些位置中是否有任何位置在 data2 中具有

实际上我没有 x 和 y 的公式,而且数组要大得多。此外,x 和 y 甚至可能不是单调的。

我认为我应该为此使用 numpy 掩码,并且我设法做到了,但结果似乎真的很折磨 - 我认为如果我只是循环使用中的值,代码会更清晰二维数组。

我认为主要问题是我无法将掩码与布尔运算结合起来。我从网上搜索得到的想法通常不适用于数组。

我认为有一种优雅且(希望)可以理解的方式来做到这一点,只需几行面具。有人愿意向我解释一下吗?

【问题讨论】:

  • 你的句子"all the points in data1 for which data1>D1min x is inside XRange y is inside YRange"不是特别清楚,请用正确的语法、标点符号重新表述,最好还提供一个简单的示例输入和所需的输出。
  • 比如"x is inside XRange"data1中的数据有什么关系?
  • 很抱歉。我已经重写它试图更清楚。

标签: python numpy


【解决方案1】:

好吧,我最终想出了一些东西,所以我想我会发布它。我欢迎提出改进建议。

#expand x and y into 2D arrays so that they can more 
#easily be used for masking using tile
x2D = np.tile(x,(len(y),1))
y2D = np.tile(y,(len(x),1)).T

#mask these based on the ranges in X and Y
Xmask = np.ma.masked_outside(x2D,XRange[0],XRange[1]).mask
Ymask = np.ma.masked_outside(y2D,YRange[0],YRange[1]).mask

#then combine them
#Not sure I need the shrink=False, but it seems safer
XYmask = np.ma.mask_or(Xmask, Ymask,shrink=False)

#now mask the data1 array based on D1mask. 
highdat = np.ma.masked_less(data1,D1min)

#combine with XYmask
data1mask = np.ma.mask_or(highdat.mask, XYmask,shrink=False) 

#apply to data1 
data1masked = np.ma.masked_where(data1mask,data1)

#number of points fulfilling my criteria
print('Number of points: ',np.ma.count(data1masked))

#transfer mask from data1 to data2
data2masked = np.ma.masked_where(data1mask, data2)
   
#do my check based on data2
if data2masked.min() < D2Max: print('data2 values are low!')

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-04-12
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多