如何在每个网格的时间轴上对 3d numpy 掩码数组进行排序,即在气候数据集的特定纬度和经度

How to sort 3d numpy masked array on time axis at each grid i.e at specific latitude and longitude for climate dataset

我有一个气候数据集的 NetCDF 文件,它具有 3D 结构,形状为 20 * 445 * 445 作为(时间,纬度,经度)

我已经使用 netCDF4numpy.ma.core.MaskedArray 阅读了它

我想在 each grid time axis 上对 NumPy 3D-array 数据进行排序,即

在任何特定网格 (latitude,longitude) 值应按升序或降序排列

我试过 numpy.argsort function 但任何 grid/pixel 的值范围都超过了数据集的原始值,所以它不起作用,即原始数据集的值在 7 到 16 之间,但是在排序,数据集中的值范围是1到19。

the code is available at the Google Collab, and the NetCDF is available here

import netCDF4 as nc
from netCDF4 import Dataset,num2date,date2num
import sys,os,numpy as np,logging
from datetime import date, datetime, timedelta
import matplotlib.pyplot as plt

fileName = 'some_file'
data = Dataset(fileName, 'r')

temp_data = data.variables['Band1'][:,:,:]

原始数据集的绘图

for i in range(0,20):
    data_to_plot = temp_data[i]
    
    fig, ax = plt.subplots(figsize = (4,4))
    ax.set_title('Layer '+ str(i))
    cax = ax.imshow(data_to_plot, cmap = plt.cm.Accent)
    
    cbar = plt.colorbar(cax,
                        orientation='vertical',
                        fraction=0.045, 
                        pad=0.05)
    ax.set_xlabel('X-axis')
    ax.set_ylabel('Y-axis')
sorted_temp_data = np.argsort(temp_data, axis=0)

排序数据集图

for i in range(0,20):
    data_to_plot = sorted_temp_data[i]
    
    fig, ax = plt.subplots(figsize = (4,4))
    ax.set_title('Layer '+ str(i))
    cax = ax.imshow(data_to_plot, cmap = plt.cm.Accent)
    
    cbar = plt.colorbar(cax,
                        orientation='vertical',
                        fraction=0.045, 
                        pad=0.05)
    
    ax.set_xlabel('X-axis')
    ax.set_ylabel('Y-axis')

如何操作?

Numpy 的 argsort 函数不 return 排序数组。它 returns 排序数组的索引。可以直接将数组沿时间轴排序(假设时间轴为第0轴)如下:

np.sort(temp_data, axis=0)

如果你想使用 argsort,代码应该是这样的:

idx = np.argsort(temp_data, axis=0)
sort_data = np.take_along_axis(temp_data, idx,axis=0)