【问题标题】:Iterating a function over an array在数组上迭代函数
【发布时间】:2021-12-28 16:34:43
【问题描述】:

以不同的方式提出这个问题的标题。

我有一个函数,它采用一个三维数组并根据特定条件屏蔽数组中的某些元素。见下文:

#function for array masking 
def masc(arr,z):
        return(np.ma.masked_where((arr[:,:,2] <= z+0.05)*(arr[:,:,2] >= z-0.05), arr[:,:,2])) 
    

arr 是 3D 数组,z 是单个值。

我现在想对多个 Z 值进行迭代。这是一个具有 2 个 z 值的示例:

masked_array1_1 = masc(xyz,z1)
masked_array1_2 = masc(xyz,z2)

masked_1 = masked_array1_1.mask + masked_array1_2.mask
masked_array1 = np.ma.array(xyz[:,:,2],mask=masked_1)

masked_array1 正是我想要的。

我已经开始编写一个 forloop 来遍历一个 Z 值的一维数组:

mask_1 = xyz[:,:,2]
for i in range(Z_all_dim):
    mask_1 += (masc(xyz,Z_all[i]).mask)

masked_array1 = np.ma.array(xyz[:,:,2], mask = mask_1)

Z_all 是一个包含 7 个唯一 z 值的数组。这段代码不起作用(整个数组最终被屏蔽)但我觉得我很接近。有没有人看看我是不是做错了什么?

【问题讨论】:

  • 也许首先将代码拆分成简单的命令并使用print() 来查看不同时刻变量中的内容——它被称为"print debuging"
  • 你的函数 masc(arr,z) 想要一个数组 arr 和标量 z,但是你给它喂了一堆东西 - (xyz,IWX_new[0],IWY_new[0],MWX[ 0],MWY[0],Z_all[i])
  • @jeremy_rutman 拍摄。感谢您注意到这一点。我拿出了一堆对这个问题没有用的其他东西,但忘记了。

标签: python arrays function numpy mask


【解决方案1】:

您的问题是在循环之前以mask_1 = xyz[:,:,2] 开头。将布尔数组添加到浮点数会将布尔值强制转换为 1 和 0,除非您的浮点数组中有任何 0,否则最终数组将全部为非零值,这会导致每个值都被屏蔽。而是这样做

mask_1 = masc(xyz, Z_all[0]).mask
for z in Z_all[1:]:
    mask_1 += masc(xyz, z).mask

或者避免任何循环并广播您的操作

# No need to pass it through `np.ma.masked_where` if
# you're just going to extract just the boolean mask
mask = (xyz[...,2,None] <= Z_all + 0.05) * (xyz[...,2,None] >= Z_all - 0.05)
mask = np.any(mask, axis=-1)

【讨论】:

  • 谢谢!完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多