1

我正在努力在一个大型(4GB)netcdf 数据文件(3 个维度:时间、经度和纬度)中填充缺失的数据。该方法是使用以下方式填充 data1 中的屏蔽值:

1) 来自 data1 的先前值或

2) 如果从 data1 中找到的值 < 从 data2 中找到的值,则使用来自另一个(也是屏蔽数据集,data2)的数据。

到目前为止,我已经尝试了几件事,其中之一是制作一个非常复杂的脚本,其中包含很长的 for 循环,在 24 小时后从未完成运行。我试图减少它,但我认为它仍然非常复杂。我相信有一个比我现在做的方式更简单的程序来做这件事,我只是不知道怎么做。

我制作了一个脚本,首先将屏蔽数据替换为零,以便使用该函数np.where获取屏蔽数据的索引(我没有找到返回屏蔽数据坐标的函数,所以这是我的工作) . 我的问题是我的代码很长,我认为运行大型数据集很耗时。我相信有一种更简单的方法可以做到这一点,但我还没有找到围绕它的其他工作。这是我目前所拥有的: : (第一部分只是生成一些易于使用的矩阵):

if __name__ == '__main__':
    import numpy as np
    import numpy.ma as ma
    from sortdata_helpers import decision_tree

    # Generating some (easy) test data to try the algorithm on:
    # data1
    rand1 = np.random.randint(10, size=(10, 10, 10))
    rand1 = ma.masked_where(rand1 > 5, rand1)
    rand1 = ma.filled(rand1, fill_value=0)
    rand1[0,:,:] = 1

    #data2
    rand2 = np.random.randint(10, size=(10, 10, 10))
    rand2[0, :, :] = 1
    coordinates1 = np.asarray(np.where(rand1 == 0)) # gives the locations of where in the data there are zeros

    filled_data = decision_tree(rand1, rand2, coordinates1)
    print(filled_data)

我定义在主脚本中调用的函数是这些,它们的使用顺序相同:

def decision_tree(data1, data2, coordinates):
    # This is the main function,
    # where the decision between data1 or data2 is chosen.
    import numpy as np
    from sortdata_helpers import generate_vector
    from sortdata_helpers import find_value

    for i in range(coordinates.shape[1]):
        coordinate = [coordinates[0, i], coordinates[1,i], coordinates[2,i]]
        AET_vec = generate_vector(data1, coordinate) # makes vector to go back in time
        AET_value = find_value(AET_vec) # Takes the vector and find closest day with data
        PET_vec =  generate_vector(data2, coordinate)
        PET_value = find_value(PET_vec)
        if PET_value > AET_value:
            data1[coordinate[0], coordinate[1], coordinate[2]] = AET_value
        else:
            data1[coordinate[0], coordinate[1], coordinate[2]] = PET_value
    return(data1)


def generate_vector(data, coordinate):
    # This one generates the vector to go back in time.
    vector = data[0:coordinate[0], coordinate[1], coordinate[2]]
    return(vector)

def find_value(vector):
    # Here the fist value in vector that is not zero is chosen as "value"
    from itertools import dropwhile
    value = list(dropwhile(lambda x: x == 0, reversed(vector)))[0]
    return(value)

希望有人对如何改进我的代码有一个好主意或建议。我仍然在努力理解 python 中的索引,我认为这肯定可以比我在这里做的更顺利。感谢您的任何建议或意见,

4

0 回答 0