diff --git a/enpt/io/reader.py b/enpt/io/reader.py index de0432d5d4703ab3f9aa5619f907e780e880e445..732bd8bbb6c67e090640543192aa4615af506f62 100644 --- a/enpt/io/reader.py +++ b/enpt/io/reader.py @@ -33,7 +33,6 @@ import logging import os from fnmatch import filter import numpy as np -from scipy.interpolate import interp1d from ..model.images import EnMAPL1Product_SensorGeo from ..options.config import EnPTConfig @@ -162,14 +161,14 @@ class L1B_Reader(object): pass -def Solar_Irradiance_reader(path_solar_irr_model: str, resol_nm: float = None, wvl_min_nm: float = None, - wvl_max_nm: float = None) -> np.ndarray: +def read_solar_irradiance(path_solar_irr_model: str, resol_nm: float = None, wvl_min_nm: float = None, + wvl_max_nm: float = None) -> np.ndarray: """Read the given solar irradiance file and return an array of irradiances. :param path_solar_irr_model: file path to solar irradiance model -> must be arranged like that: - col0 = Wavelength[nm]; col1 = Solar Irradiance [W/m2/µm]) + col0 = Wavelength[nm]; col1 = Solar Irradiance [W/m2/µm] :param resol_nm: spectral resolution for returned irradiances [nanometers] :param wvl_min_nm: minimum wavelength of returned irradiances [nanometers] :param wvl_max_nm: maximum wavelength of returned irradiances [nanometers] @@ -180,5 +179,5 @@ def Solar_Irradiance_reader(path_solar_irr_model: str, resol_nm: float = None, w wvl_min = (np.min(sol_irr[:, 0]) if wvl_min_nm is None else wvl_min_nm) wvl_max = (np.max(sol_irr[:, 0]) if wvl_max_nm is None else wvl_max_nm) wvl_rsp = np.arange(wvl_min, wvl_max, resol_nm) - sol_irr = interp1d(sol_irr[:, 0], sol_irr[:, 1], kind='linear')(wvl_rsp) + sol_irr = np.interp(wvl_rsp, sol_irr[:, 0], sol_irr[:, 1]) return sol_irr diff --git a/enpt/model/metadata/metadata_sensorgeo.py b/enpt/model/metadata/metadata_sensorgeo.py index a95da215ed2ac49fc320095a490ba4317cd56c79..d51ddaf450b182d8cdf07998823eab5535a5a39b 100644 --- a/enpt/model/metadata/metadata_sensorgeo.py +++ b/enpt/model/metadata/metadata_sensorgeo.py @@ -384,11 +384,10 @@ class EnMAP_Metadata_L1B_Detector_SensorGeo(object): return gA else: - from scipy.interpolate import interp1d - coeffs_interp = \ - interp1d(gA.meta.band_meta['wavelength'], gA[:], - axis=2, kind='linear', fill_value="extrapolate", bounds_error=False)(self.wvl_center) - + from scipy.interpolate import make_interp_spline + # equivalent to legacy scipy.interpolate.interp1d + # interp1d(wvl, gA[:], axis=2, kind='linear', fill_value="extrapolate", bounds_error=False)(self.wvl_center) + coeffs_interp = make_interp_spline(gA.meta.band_meta['wavelength'], gA[:], k=1, axis=2)(self.wvl_center) gA_ = GeoArray(coeffs_interp) gA_.meta.band_meta['wavelength'] = self.wvl_center @@ -444,11 +443,11 @@ class EnMAP_Metadata_L1B_Detector_SensorGeo(object): return lons, lats def calc_solar_irradiance_CWL_FWHM_per_band(self) -> np.array: - from ...io.reader import Solar_Irradiance_reader + from ...io.reader import read_solar_irradiance self.logger.debug('Calculating solar irradiance...') - sol_irr = Solar_Irradiance_reader(path_solar_irr_model=self.cfg.path_solar_irr, wvl_min_nm=350, wvl_max_nm=2500) + sol_irr = read_solar_irradiance(path_solar_irr_model=self.cfg.path_solar_irr, wvl_min_nm=350, wvl_max_nm=2500) irr_bands = [] for band in self.srf.bands: diff --git a/enpt/processors/spatial_transform/spatial_transform.py b/enpt/processors/spatial_transform/spatial_transform.py index 17dcbf0581b2e446d37d92032c912075c663bd99..3ec62842f664df633d80aa4b527527e4139be72b 100644 --- a/enpt/processors/spatial_transform/spatial_transform.py +++ b/enpt/processors/spatial_transform/spatial_transform.py @@ -32,7 +32,7 @@ from typing import Union, Tuple, List, Optional, Sequence # noqa: F401 from multiprocessing import Pool, cpu_count from collections import OrderedDict import numpy as np -from scipy.interpolate import interp1d, LinearNDInterpolator +from scipy.interpolate import LinearNDInterpolator, make_interp_spline from scipy.spatial import Delaunay from geoarray import GeoArray from natsort import natsorted @@ -405,26 +405,27 @@ class RPC_Geolayer_Generator(object): raise ValueError(arr.ndim, '2D numpy array expected.') if along_axis not in [0, 1]: raise ValueError(along_axis, "The 'axis' parameter must be set to 0 or 1") - - kw = dict(kind='linear', fill_value='extrapolate') + arr[0, 0] = np.nan + arr[0, 1] = np.nan + arr[1, 1] = np.nan nans = np.isnan(arr) if along_axis == 0: - # extrapolate in top/bottom direction + # extrapolate linearly in top/bottom direction cols_with_nan = np.arange(arr.shape[1])[np.any(nans, axis=0)] for col in cols_with_nan: data = arr[:, col] idx_goodvals = np.argwhere(~nans[:, col]).flatten() - arr[:, col] = interp1d(idx_goodvals, data[idx_goodvals], **kw)(range(data.size)) + arr[:, col] = make_interp_spline(idx_goodvals, data[idx_goodvals], k=1)(range(data.size)) else: - # extrapolate in left/right direction + # extrapolate linearly in left/right direction rows_with_nan = np.arange(arr.shape[0])[np.any(nans, axis=1)] for row in rows_with_nan: data = arr[row, :] idx_goodvals = np.argwhere(~nans[row, :]).flatten() - arr[row, :] = interp1d(idx_goodvals, data[idx_goodvals], **kw)(range(data.size)) + arr[row, :] = make_interp_spline(idx_goodvals, data[idx_goodvals], k=1)(range(data.size)) return arr