应用掩码加速各种数组计算

时间:2014-10-21 10:48:38

标签: python arrays performance numpy netcdf

我有np.ndarray数字表示感兴趣的点,我对值为1和9的点感兴趣。

现在它们被提取出来了:

maskindex.append(np.where(extract.variables['mask'][0] == 1) or np.where(megadatalist[0].variables['mask'][0] == 9))

xval = maskindex[0][1]
yval = maskindex[0][0]

我需要将这些x和y值应用于我正在操作的数组,以加快速度。

我有140个阵列,每个都是734 x 1468,我需要为每个字段计算平均值,最大值,最小值,标准值。我希望有一个简单的方法来应用蒙面数组来加速操作,现在我只是在整个数组上这样做:

Average_List = np.mean([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)], axis=0)
Average_Error_List = np.mean([megadatalist[i].variables['analysis_error'][0] for i in range(0,Numbers_of_datasets)], axis=0)
Std_List     = np.std([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)], axis=0)
Maximum_List = np.maximum.reduce([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)])
Minimum_List = np.minimum.reduce([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)])

关于如何加快速度的任何想法都将受到高度赞赏

1 个答案:

答案 0 :(得分:1)

我可能已经部分解决了这个问题,具体取决于你的目标。以下代码将数组arr简化为仅包含相关指标的1d数组。然后,您可以在不考虑不需要的位置的情况下进行所需的计算

arr = np.array([[0,9,9,0,0,9,9,1],[9,0,1,9,0,0,0,1]])
target = [1,9] # wanted values
index = np.where(np.in1d(arr.ravel(), target).reshape(arr.shape))

no_zeros = arr[index]

在这个阶段"你需要的所有"是重新插入价值观" no_zeros"在" index"中给出的索引上,在具有适当形状的零数组上。一种方法是展平索引数组并重新计算索引,以便它们匹配展平的arr数组。然后使用numpy.insert(np.zeroes(arr.shape),new_index,no_zeroes),然后重新塑造到适当的形状。重塑是numpy的恒定时间。不可否认,我还没有想出一个快速的numpy方法来创建new_index数组。

希望它有所帮助。