【问题标题】:Numpy mask array multiple times and fill nans in 3D array with values from another 3D arrayNumpy 掩码数组多次并用另一个 3D 数组中的值填充 3D 数组中的 nans
【发布时间】:2020-09-16 16:10:12
【问题描述】:

我有以下代码:

import numpy as np



def fill(arr1, arr2, arr3, arr4, thresh= 0.5):
    out_arr = np.zeros(arr1.shape)
    for i in range(0,len(arr1)):
        arr1[i] = np.where(np.abs(arr1[i])<=thresh,np.nan,arr1[i])
        mask = np.isnan(arr1[i])
        arr1[i] = np.nan_to_num(arr1[i])
        merged1 = (arr2[i]*mask)+arr1[i]


        merged2 = np.where(np.abs(merged1)<=thresh,np.nan,merged1)
        mask = np.isnan(merged2)
        merged2 = np.nan_to_num(merged2)
        merged3 = (arr3[i]*mask)+merged2

        merged3 = np.where(np.abs(merged3)<=thresh,np.nan,merged3)
        mask = np.isnan(merged3)
        merged3 = np.nan_to_num(merged3)
        merged4 = (arr4[i]*mask)+merged3



        out_arr[i] = merged4


    return(out_arr)




arr1 = np.random.rand(10, 10, 10)
arr2 = np.random.rand(10, 10, 10)
arr3 = np.random.rand(10, 10, 10)
arr4 = np.random.rand(10, 10, 10)
arr = fill(arr1, arr2, arr3, arr4, 0.5)

我想知道是否有更有效的方法可以使用屏蔽数组?基本上我正在做的是用下一个数组替换 3D 数组的每一层中低于阈值的值,这超过 4 个数组。对于 n 个数组,这会是什么样子? 谢谢!

【问题讨论】:

  • np.ma 数组不会提高效率。每个操作都必须更新datamask。它们可能很方便,但它们不是速度工具。

标签: python arrays numpy masking


【解决方案1】:

您的功能可以通过多种方式进行简化。在效率方面,最重要的方面是您不需要迭代第一个维度,您可以直接对整个数组进行操作。除此之外,您可以将替换逻辑重构为更简单的东西,并使用循环来避免一遍又一遍地重复相同的代码:

import numpy as np

# Function accepts as many arrays as wanted, with at least one
# (threshold needs to be passed as keyword parameter)
def fill(arr1, *arrs, thresh=0.5):
    # Output array
    out_arr = arr1.copy()
    for arr in arrs:
        # Replace values that are still below threshold
        mask = np.abs(out_arr) <= thresh
        out_arr[mask] = arr[mask]
    return out_arr

由于thresh需要在这个函数中作为关键字参数传递,你可以这样称呼它:

arr = fill(arr1, arr2, arr3, arr4, thresh=0.5)

【讨论】:

  • 抱歉,您的回答不够深入。您没有在 for 循环中定义变量掩码。您每次都需要这样做,因为新值可能包含
  • 我在您的代码中添加了一个编辑,因为屏蔽无法正常工作。基本上,该功能现在是我和你的合并。解决了最多的问题:无需遍历所有层并且可以将n个数组传递给函数。我添加了 if/else 以避免在 out_arr 中返回 nans。另一个问题仍然存在:for 循环中仍有 5 个 numpy 操作,当将大量数组传递给函数时,这可能会非常慢。感谢您的帮助!
  • @benschbob91 感谢您的反馈,对不起,我在写答案时对代码进行了最后一分钟的更改,结果搞砸了。我认为我现在写的内容解决了它,如果不是这样,请告诉我。
  • 非常感谢!您的答案将计算速度提高了几个数量级并且是正确的。我接受了答案。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2021-03-20
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多