From ed90ae352979741901308855d98200fdecec2714 Mon Sep 17 00:00:00 2001 From: wyq Date: Tue, 22 Aug 2023 09:25:11 +0800 Subject: [PATCH] add gradient function in numeric package --- meteoinfo-lab/milconfig.xml | 14 +- .../pylib/mipylib/numeric/core/_ndarray.py | 28 ++- .../mipylib/numeric/core/fromnumeric$py.class | Bin 14472 -> 14562 bytes .../pylib/mipylib/numeric/core/fromnumeric.py | 5 +- .../mipylib/numeric/core/numeric$py.class | Bin 154584 -> 154424 bytes .../pylib/mipylib/numeric/core/numeric.py | 22 +- .../mipylib/numeric/lib/function_base.py | 207 +++++++++++++++++- .../org/meteoinfo/ndarray/math/ArrayMath.java | 6 +- .../org/meteoinfo/ndarray/math/ArrayUtil.java | 2 +- 9 files changed, 254 insertions(+), 30 deletions(-) diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 42bdf7f0..063f604e 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,14 +1,10 @@ - - - - + - @@ -16,19 +12,23 @@ + + + + - + - + diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py index b7a38fa0..63e9671a 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py @@ -20,8 +20,8 @@ class NDArray(object): if not isinstance(array, Array): array = ArrayUtil.array(array, None) - if array.getRank() == 0 and array.getDataType() != DataType.STRUCTURE: - array = ArrayUtil.array([array.getIndexIterator().getObjectNext()]) + # if array.getRank() == 0 and array.getDataType() != DataType.STRUCTURE: + # array = ArrayUtil.array([array.getIndexIterator().getObjectNext()]) self._array = array self.ndim = array.getRank() @@ -153,7 +153,7 @@ class NDArray(object): indices = nindices if len(indices) != self.ndim: - print 'indices must be ' + str(self.ndim) + ' dimensions!' + print('indices must be ' + str(self.ndim) + ' dimensions!') raise IndexError() ranges = [] @@ -582,6 +582,24 @@ class NDArray(object): r = NDArray(ArrayMath.inValues(self._array, other)) return r + def all(self, axis=None): + """ + Test whether all array element along a given axis evaluates to True. + + :param x: (*array_like or list*) Input values. + :param axis: (*int*) Axis along which a logical OR reduction is performed. + The default (axis = None) is to perform a logical OR over all the + dimensions of the input array. + + :returns: (*array_like*) All result + """ + if axis is None: + return ArrayMath.all(self._array) + else: + if axis < 0: + axis += self.ndim + return NDArray(ArrayMath.all(self._array, axis)) + def any(self, axis=None): """ Test whether any array element along a given axis evaluates to True. @@ -942,7 +960,7 @@ class NDArray(object): :param axis: (*int*) Axis along which the standard deviation is computed. The default is to compute the standard deviation of the flattened array. :param ddof: (*int*) Delta Degrees of Freedom: the divisor used in the calculation is - N - ddof, where N represents the number of elements. By default ddof is zero. + N - ddof, where N represents the number of elements. By default, ddof is zero. returns: (*array_like*) Standart deviation result. """ @@ -1222,7 +1240,7 @@ class NDArray(object): :param indices: (*array_like*) The indices of the values to extract. :param axis: (*int*) The axis over which to select values. - :returns: (*array*) The returned array has the same type as a. + :returns: (*array*) The returned array has the same type as this array. """ if isinstance(indices, (list, tuple)): indices = NDArray(indices) diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class index 842e057d96438df1d2850a6a692b0d11ca1fda7f..401055b662babd1aa981f5be1ad0a598a1c1092e 100644 GIT binary patch literal 14562 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 literal 14472 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 UwNc@CM_qHdN+_Fea%%I>0VhOuRsaA1 diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py index 3f5dc02f..3af84f48 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py @@ -1,6 +1,6 @@ # coding=utf-8 -from .numeric import asarray, array +from .numeric import asarray, array, isscalar from ._ndarray import NDArray from .dimarray import DimArray from org.meteoinfo.ndarray.math import ArrayUtil, ArrayMath @@ -39,6 +39,9 @@ def ndim(a): >>> np.ndim(1) 0 """ + if isscalar(a): + return 0 + try: return a.ndim except AttributeError: diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class index 8ddb374908060226721f4695cef0bab93ed1fd2d..5c4d87ea9e5136b4dad12a7646965230c129c980 100644 GIT binary patch delta 29655 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 diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py index b64ffa4e..cfbd8bc8 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py @@ -110,14 +110,15 @@ def array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0): elif miutil.iscomplex(object): a = NDArray(JythonUtil.toComplexArray(object)) - if isinstance(dtype, basestring): - dtype = _dtype.DataType(dtype) - - if not dtype is None: - dtype = dtype._dtype - if a is None: - a = NDArray(ArrayUtil.array(object, dtype)) + if isinstance(dtype, basestring): + dtype = _dtype.DataType(dtype) + + if not dtype is None: + dtype = dtype._dtype + a = NDArray(ArrayUtil.array(object, dtype)) + else: + a = NDArray(object) if a.ndim < ndmin: shape = [] @@ -1233,12 +1234,7 @@ def all(x, axis=None): if isinstance(x, list): x = array(x) - if axis is None: - return ArrayMath.all(x._array) - else: - if axis < 0: - axis += x.ndim - return NDArray(ArrayMath.all(x._array, axis)) + return x.all(axis) def isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False): """ diff --git a/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py b/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py index f48b9383..e8a17e20 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py @@ -1,10 +1,11 @@ +from mipylib import numeric as np from ..core import numeric as _nx from ..core import dtype from ..core._ndarray import NDArray from ..core.fromnumeric import (ravel, nonzero) from org.meteoinfo.ndarray.math import ArrayMath -__all__ = ['angle','extract', 'place', 'grid_edge'] +__all__ = ['angle','extract', 'place', 'grid_edge', 'gradient'] def extract(condition, arr): @@ -161,3 +162,207 @@ def angle(z, deg=False): if deg: a *= 180 / _nx.pi return a + +def gradient(f, *varargs, **kwargs): + """ + Return the gradient of an N-dimensional array. + + The gradient is computed using second order accurate central differences + in the interior points and either first or second order accurate one-sides + (forward or backwards) differences at the boundaries. + The returned gradient hence has the same shape as the input array. + + Parameters + ---------- + f : array_like + An N-dimensional array containing samples of a scalar function. + varargs : list of scalar or array, optional + Spacing between f values. Default unitary spacing for all dimensions. + Spacing can be specified using: + + 1. single scalar to specify a sample distance for all dimensions. + 2. N scalars to specify a constant sample distance for each dimension. + i.e. `dx`, `dy`, `dz`, ... + 3. N arrays to specify the coordinates of the values along each + dimension of F. The length of the array must match the size of + the corresponding dimension + 4. Any combination of N scalars/arrays with the meaning of 2. and 3. + + If `axis` is given, the number of varargs must equal the number of axes. + Default: 1. + + edge_order : {1, 2}, optional + Gradient is calculated using N-th order accurate differences + at the boundaries. Default: 1. + + axis : None or int or tuple of ints, optional + Gradient is calculated only along the given axis or axes + The default (axis = None) is to calculate the gradient for all the axes + of the input array. axis may be negative, in which case it counts from + the last to the first axis. + + Returns + ------- + gradient : ndarray or list of ndarray + A list of ndarrays (or a single ndarray if there is only one dimension) + corresponding to the derivatives of f with respect to each dimension. + Each derivative has the same shape as f. + """ + f = _nx.asanyarray(f) + N = f.ndim # number of dimensions + + axis = kwargs.pop('axis', None) + edge_order = kwargs.pop('edge_order', 1) + + if axis is None: + axes = tuple(range(N)) + else: + axes = _nx.normalize_axis_tuple(axis, N) + + len_axes = len(axes) + n = len(varargs) + if n == 0: + # no spacing argument - use 1 in all axes + dx = [1.0] * len_axes + elif n == 1 and np.ndim(varargs[0]) == 0: + # single scalar for all axes + dx = varargs * len_axes + elif n == len_axes: + # scalar or 1d array for each axis + dx = list(varargs) + for i, distances in enumerate(dx): + distances = _nx.asanyarray(distances) + if distances.ndim == 0: + continue + elif distances.ndim != 1: + raise ValueError("distances must be either scalars or 1d") + if len(distances) != f.shape[axes[i]]: + raise ValueError("when 1d, distances must match " + "the length of the corresponding dimension") + if distances.dtype == dtype.int: + # Convert numpy integer types to float to avoid modular + # arithmetic in np.diff(distances). + distances = distances.astype(dtype.float) + diffx = _nx.diff(distances) + # if distances are constant reduce to the scalar case + # since it brings a consistent speedup + if (diffx == diffx[0]).all(): + diffx = diffx[0] + dx[i] = diffx + else: + raise TypeError("invalid number of arguments") + + if edge_order > 2: + raise ValueError("'edge_order' greater than 2 not supported") + + # use central differences on interior and one-sided differences on the + # endpoints. This preserves second order-accuracy over the full domain. + + outvals = [] + + # create slice objects --- initially all are [:, :, ..., :] + slice1 = [slice(None)]*N + slice2 = [slice(None)]*N + slice3 = [slice(None)]*N + slice4 = [slice(None)]*N + + otype = f.dtype + if otype == dtype.int: + otype = dtype.float + + for axis, ax_dx in zip(axes, dx): + if f.shape[axis] < edge_order + 1: + raise ValueError( + "Shape of array too small to calculate a numerical gradient, " + "at least (edge_order + 1) elements are required.") + # result allocation + out = np.empty_like(f, dtype=otype) + + # spacing for the current axis + uniform_spacing = np.ndim(ax_dx) == 0 + + # Numerical differentiation: 2nd order interior + slice1[axis] = slice(1, -1) + slice2[axis] = slice(None, -2) + slice3[axis] = slice(1, -1) + slice4[axis] = slice(2, None) + + if uniform_spacing: + out[tuple(slice1)] = (f[tuple(slice4)] - f[tuple(slice2)]) / (2. * ax_dx) + else: + dx1 = ax_dx[0:-1] + dx2 = ax_dx[1:] + a = -(dx2)/(dx1 * (dx1 + dx2)) + b = (dx2 - dx1) / (dx1 * dx2) + c = dx1 / (dx2 * (dx1 + dx2)) + # fix the shape for broadcasting + shape = np.ones(N, dtype=dtype.int) + shape[axis] = -1 + a.shape = b.shape = c.shape = shape + # 1D equivalent -- out[1:-1] = a * f[:-2] + b * f[1:-1] + c * f[2:] + out[tuple(slice1)] = a * f[tuple(slice2)] + b * f[tuple(slice3)] + c * f[tuple(slice4)] + + # Numerical differentiation: 1st order edges + if edge_order == 1: + slice1[axis] = 0 + slice2[axis] = 1 + slice3[axis] = 0 + dx_0 = ax_dx if uniform_spacing else ax_dx[0] + # 1D equivalent -- out[0] = (f[1] - f[0]) / (x[1] - x[0]) + out[tuple(slice1)] = (f[tuple(slice2)] - f[tuple(slice3)]) / dx_0 + + slice1[axis] = -1 + slice2[axis] = -1 + slice3[axis] = -2 + dx_n = ax_dx if uniform_spacing else ax_dx[-1] + # 1D equivalent -- out[-1] = (f[-1] - f[-2]) / (x[-1] - x[-2]) + out[tuple(slice1)] = (f[tuple(slice2)] - f[tuple(slice3)]) / dx_n + + # Numerical differentiation: 2nd order edges + else: + slice1[axis] = 0 + slice2[axis] = 0 + slice3[axis] = 1 + slice4[axis] = 2 + if uniform_spacing: + a = -1.5 / ax_dx + b = 2. / ax_dx + c = -0.5 / ax_dx + else: + dx1 = ax_dx[0] + dx2 = ax_dx[1] + a = -(2. * dx1 + dx2)/(dx1 * (dx1 + dx2)) + b = (dx1 + dx2) / (dx1 * dx2) + c = - dx1 / (dx2 * (dx1 + dx2)) + # 1D equivalent -- out[0] = a * f[0] + b * f[1] + c * f[2] + out[tuple(slice1)] = a * f[tuple(slice2)] + b * f[tuple(slice3)] + c * f[tuple(slice4)] + + slice1[axis] = -1 + slice2[axis] = -3 + slice3[axis] = -2 + slice4[axis] = -1 + if uniform_spacing: + a = 0.5 / ax_dx + b = -2. / ax_dx + c = 1.5 / ax_dx + else: + dx1 = ax_dx[-2] + dx2 = ax_dx[-1] + a = (dx2) / (dx1 * (dx1 + dx2)) + b = - (dx2 + dx1) / (dx1 * dx2) + c = (2. * dx2 + dx1) / (dx2 * (dx1 + dx2)) + # 1D equivalent -- out[-1] = a * f[-3] + b * f[-2] + c * f[-1] + out[tuple(slice1)] = a * f[tuple(slice2)] + b * f[tuple(slice3)] + c * f[tuple(slice4)] + + outvals.append(out) + + # reset the slice object in this dimension to ":" + slice1[axis] = slice(None) + slice2[axis] = slice(None) + slice3[axis] = slice(None) + slice4[axis] = slice(None) + + if len_axes == 1: + return outvals[0] + else: + return outvals \ No newline at end of file diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java index 206aaeae..eaceb98d 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java @@ -6022,8 +6022,10 @@ public class ArrayMath { public static Array setSection(Array a, List ranges, Array v) throws InvalidRangeException { Array r = a.section(ranges); IndexIterator iter = r.getIndexIterator(); - if (r.getShape() != v.getShape()) { - v = ArrayUtil.broadcast(v, r.getShape()); + if (r.getSize() != v.getSize()) { + if (r.getShape() != v.getShape()) { + v = ArrayUtil.broadcast(v, r.getShape()); + } } Index index = v.getIndex(); while (iter.hasNext()) { diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java index ce1c2591..91541f41 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java @@ -652,7 +652,7 @@ public class ArrayUtil { } else { if (dt == null) dt = ArrayMath.getDataType(data); - Array a = Array.factory(dt, new int[]{1}); + Array a = Array.factory(dt, new int[0]); if (data instanceof String) { a.setString(0, (String)data); } else {