我正在努力在一个大型(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 中的索引,我认为这肯定可以比我在这里做的更顺利。感谢您的任何建议或意见,