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

标签 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)])

任何有关如何加快速度的想法将不胜感激

最佳答案

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

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) 然后 reshape 为适当的形状。在 numpy 中, reshape 是常数时间。不可否认,我还没有找到一种快速的 numpy 方法来创建 new_index 数组。

希望有帮助。

关于python - 应用掩码来加速各种数组计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484848/

相关文章:

PHP html DOM 对比纯 HTML 速度

sql - 用户定义的函数 - 它们是糟糕的编码实践吗?

python - 迭代数据框时如何引用行和列

python - 在 python 中从图像创建二进制 RGB 值会导致大小错误

python - 如何将字符串值提取到对象字段中

python - 使用 dataclasses.MISSING 作为 Python 数据类的可选参数值?

c# - 将偶数键和奇数值数组转换为字典的最优雅方法?

ruby-on-rails - 如何将多级数组中的唯一值映射到 value=>array 的散列?

javascript - Lodash _.hasIntersection?

Java:如何构建可扩展的Job处理机制