forked from mindspore-Ecosystem/mindspore
Add new np interfaces
This commit is contained in:
parent
b98c508e86
commit
560ef0036f
|
@ -728,6 +728,15 @@ class Validator:
|
|||
raise ValueError(f"axis {axes} has shape entry {s} > 1, cannot be squeezed.")
|
||||
return tuple(new_shape)
|
||||
|
||||
@staticmethod
|
||||
def check_axis_in_range(axis, ndim):
|
||||
"""Checks axes are with the bounds of ndim"""
|
||||
if not isinstance(axis, int):
|
||||
raise TypeError(f'axes should be integers, not {type(axis)}')
|
||||
if not -ndim <= axis < ndim:
|
||||
raise ValueError(f'axis {axis} is out of bounds for array of dimension {ndim}')
|
||||
return axis % ndim
|
||||
|
||||
|
||||
def check_input_format(input_param):
|
||||
"""Judge input format."""
|
||||
|
|
|
@ -148,7 +148,34 @@ def strides_(x):
|
|||
|
||||
|
||||
def astype(x, dtype, copy=True):
|
||||
"""Implementation of `astype`."""
|
||||
"""
|
||||
Return a copy of the tensor, casted to a specified type.
|
||||
|
||||
Args:
|
||||
dtype (Union[:class:`mindspore.dtype`, str]): Designated tensor dtype, can be in format
|
||||
of :class:`mindspore.dtype.float32` or `float32`.
|
||||
Default: :class:`mindspore.dtype.float32`.
|
||||
copy (bool, optional): By default, astype always returns a newly allocated
|
||||
tensor. If this is set to false, the input tensor is returned instead
|
||||
of a copy if possible. Default: True.
|
||||
|
||||
Returns:
|
||||
Tensor, with the designated dtype.
|
||||
|
||||
Raises:
|
||||
TypeError: If `dtype` has types not specified above, or values cannot be understood.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((1,2,2,1), dtype=np.float32))
|
||||
>>> x = x.astype("int32")
|
||||
>>> print(x.dtype)
|
||||
Int32
|
||||
"""
|
||||
dtype = check_astype_dtype_const(dtype)
|
||||
if not copy and dtype == x.dtype:
|
||||
return x
|
||||
|
@ -156,7 +183,40 @@ def astype(x, dtype, copy=True):
|
|||
|
||||
|
||||
def transpose(x, *axis):
|
||||
"""Implementation of `transpose`."""
|
||||
r"""
|
||||
Return a view of the tensor with axes transposed.
|
||||
|
||||
For a 1-D tensor this has no effect, as a transposed vector is simply the
|
||||
same vector. For a 2-D tensor, this is a standard matrix transpose. For a
|
||||
n-D tensor, if axes are given, their order indicates how the axes are permuted.
|
||||
If axes are not provided and tensor.shape = (i[0], i[1],...i[n-2], i[n-1]),
|
||||
then tensor.transpose().shape = (i[n-1], i[n-2], ... i[1], i[0]).
|
||||
|
||||
Args:
|
||||
axes(Union[None, tuple(int), list(int), int], optional): If axes is None or
|
||||
blank, tensor.transpose() will reverse the order of the axes. If axes is tuple(int)
|
||||
or list(int), tensor.transpose() will transpose the tensor to the new axes order.
|
||||
If axes is int, this form is simply intended as a convenience alternative to the
|
||||
tuple/list form.
|
||||
|
||||
Returns:
|
||||
Tensor, has the same dimension as input tensor, with axes suitably permuted.
|
||||
|
||||
Raises:
|
||||
TypeError: If input arguments have types not specified above.
|
||||
ValueError: If the number of `axes` is not euqal to a.ndim.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((1,2,3), dtype=np.float32))
|
||||
>>> x = x.transpose()
|
||||
>>> print(x.shape)
|
||||
(3, 2, 1)
|
||||
"""
|
||||
ndim = F.rank(x)
|
||||
perm = check_transpose_axis_const(axis, ndim)
|
||||
return F.transpose(x, perm)
|
||||
|
@ -167,27 +227,86 @@ T_ = transpose
|
|||
|
||||
|
||||
def reshape(x, *shape):
|
||||
"""Implementation of `reshape`."""
|
||||
"""
|
||||
Give a new shape to a tensor without changing its data.
|
||||
|
||||
Args:
|
||||
shape(Union[int, tuple(int), list(int)]): The new shape should be compatible
|
||||
with the original shape. If an integer, then the result will be a 1-D
|
||||
array of that length. One shape dimension can be -1. In this case, the
|
||||
value is inferred from the length of the array and remaining dimensions.
|
||||
|
||||
Returns:
|
||||
Tensor, with new specified shape.
|
||||
|
||||
Raises:
|
||||
TypeError: If new_shape is not integer, list or tuple, or `x` is not tensor.
|
||||
ValueError: If new_shape is not compatible with the original shape.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> from mindspore import Tensor
|
||||
>>> from mindspore import dtype as mstype
|
||||
>>> x = Tensor([[-0.1, 0.3, 3.6], [0.4, 0.5, -3.2]], dtype=mstype.float32)
|
||||
>>> output = np.reshape(x, (3, 2))
|
||||
>>> print(output)
|
||||
[[-0.1 0.3]
|
||||
[ 3.6 0.4]
|
||||
[ 0.5 -3.2]]
|
||||
"""
|
||||
new_shape = check_reshape_shp_const(shape)
|
||||
return F.reshape(x, new_shape)
|
||||
|
||||
|
||||
def ravel(x):
|
||||
"""Implementation of `ravel`."""
|
||||
"""
|
||||
Return a contiguous flattened tensor.
|
||||
|
||||
Returns:
|
||||
Tensor, a 1-D tensor, containing the same elements of the input.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((2,3,4), dtype=np.float32))
|
||||
>>> output = x.ravel()
|
||||
>>> print(output.shape)
|
||||
(24,)
|
||||
"""
|
||||
return reshape(x, (-1,))
|
||||
|
||||
|
||||
def flatten(x, order='C'):
|
||||
"""
|
||||
Returns a copy of the array collapsed into one dimension.
|
||||
r"""
|
||||
Return a copy of the tensor collapsed into one dimension.
|
||||
|
||||
Args:
|
||||
order (str, optional): Can choose between `C` and `F`. `C` means to
|
||||
flatten in row-major (C-style) order. ‘F’ means to flatten in column-major
|
||||
(Fortran- style) order. Only `C` and `F` are supported.
|
||||
order (str, optional): Can choose between 'C' and 'F'. 'C' means to
|
||||
flatten in row-major (C-style) order. 'F' means to flatten in column-major
|
||||
(Fortran-style) order. Only 'C' and 'F' are supported. Default: 'C'.
|
||||
|
||||
Returns:
|
||||
Tensor, has the same data type as x.
|
||||
Tensor, has the same data type as input.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
TypeError: If `order` is not string type.
|
||||
ValueError: If `order` is string type, but not 'C' or 'F'.
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((2,3,4), dtype=np.float32))
|
||||
>>> output = x.flatten()
|
||||
>>> print(output.shape)
|
||||
(24,)
|
||||
"""
|
||||
order = check_flatten_order_const(order)
|
||||
if order == 'C':
|
||||
|
@ -200,14 +319,29 @@ def flatten(x, order='C'):
|
|||
|
||||
def swapaxes(x, axis1, axis2):
|
||||
"""
|
||||
Interchanges two axes of a tensor.
|
||||
Interchange two axes of a tensor.
|
||||
|
||||
Args:
|
||||
axis1 (int): First axis.
|
||||
axis2 (int): Second axis.
|
||||
|
||||
Returns:
|
||||
Transposed tensor, has the same data type as the original tensor x.
|
||||
Transposed tensor, has the same data type as the input.
|
||||
|
||||
Raises:
|
||||
TypeError: If `axis1` or `axis2` is not integer.
|
||||
ValueError: If `axis1` or `axis2` is not in the range of :math:`[-ndim, ndim-1]`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((2,3,4), dtype=np.float32))
|
||||
>>> output = np.swapaxes(x, 0, 2)
|
||||
>>> print(output.shape)
|
||||
(4,3,2)
|
||||
"""
|
||||
axis1, axis2 = check_swapaxes_axis_const((axis1, axis2), x.ndim)
|
||||
|
||||
|
@ -230,13 +364,28 @@ def swapaxes(x, axis1, axis2):
|
|||
|
||||
def squeeze(x, axis=None):
|
||||
"""
|
||||
Removes single-dimensional entries from the shape of an tensor.
|
||||
Remove single-dimensional entries from the shape of a tensor.
|
||||
|
||||
Args:
|
||||
axis: Union[None, int, list(int), tuple(list)]. Default is None.
|
||||
axis (Union[None, int, list(int), tuple(int)], optional): Default is None.
|
||||
|
||||
Returns:
|
||||
Tensor, with all or a subset of the dimensions of length 1 removed.
|
||||
|
||||
Raises:
|
||||
TypeError: If input arguments have types not specified above.
|
||||
ValueError: If specified axis has shape entry :math:`> 1`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((1,2,2,1), dtype=np.float32))
|
||||
>>> x = x.squeeze()
|
||||
>>> print(x.shape)
|
||||
(2, 2)
|
||||
"""
|
||||
shape = F.shape(x)
|
||||
if axis is None:
|
||||
|
@ -246,6 +395,78 @@ def squeeze(x, axis=None):
|
|||
return F.reshape(x, new_shape)
|
||||
|
||||
|
||||
def argmax(x, axis=None):
|
||||
"""
|
||||
Returns the indices of the maximum values along an axis.
|
||||
|
||||
Args:
|
||||
axis (int, optional): By default, the index is into
|
||||
the flattened array, otherwise along the specified axis.
|
||||
|
||||
Returns:
|
||||
Tensor, array of indices into the array. It has the same
|
||||
shape as a.shape with the dimension along axis removed.
|
||||
|
||||
Raises:
|
||||
ValueError: if axis is out of range.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> a = Tensor(np.arange(10, 16).reshape(2, 3).astype("float32"))
|
||||
>>> print(np.argmax(a))
|
||||
5
|
||||
"""
|
||||
# P.Argmax only supports float
|
||||
x = x.astype(mstype.float32)
|
||||
if axis is None:
|
||||
x = ravel(x)
|
||||
axis = 0
|
||||
else:
|
||||
axis = check_axis_in_range_const(axis, F.rank(x))
|
||||
return P.Argmax(axis)(x)
|
||||
|
||||
|
||||
def argmin(x, axis=None):
|
||||
"""
|
||||
Returns the indices of the minimum values along an axis.
|
||||
|
||||
Args:
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input array.
|
||||
axis (int, optional): By default, the index is into
|
||||
the flattened array, otherwise along the specified axis.
|
||||
|
||||
Returns:
|
||||
Tensor, array of indices into the array. It has the same
|
||||
shape as a.shape with the dimension along axis removed.
|
||||
|
||||
Raises:
|
||||
ValueError: if axis is out of range.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> a = Tensor(np.arange(10, 16).reshape(2, 3).astype("float32"))
|
||||
>>> print(np.argmin(a))
|
||||
0
|
||||
"""
|
||||
# P.Argmax only supports float
|
||||
x = x.astype(mstype.float32)
|
||||
if axis is None:
|
||||
x = ravel(x)
|
||||
axis = 0
|
||||
else:
|
||||
axis = check_axis_in_range_const(axis, F.rank(x))
|
||||
# P.Argmin is currently not supported
|
||||
return P.Argmax(axis)(F.neg_tensor(x))
|
||||
|
||||
|
||||
def getitem(data, item):
|
||||
"""Implementation of `getitem`."""
|
||||
return data.__getitem__(item)
|
||||
|
@ -466,6 +687,7 @@ check_reshape_shp_const = constexpr(validator.check_reshape_shp)
|
|||
check_flatten_order_const = constexpr(validator.check_flatten_order)
|
||||
check_swapaxes_axis_const = constexpr(validator.check_swapaxes_axis)
|
||||
prepare_shape_for_squeeze_const = constexpr(validator.prepare_shape_for_squeeze)
|
||||
check_axis_in_range_const = constexpr(validator.check_axis_in_range)
|
||||
|
||||
|
||||
def tensor_bool(x):
|
||||
|
|
|
@ -184,6 +184,8 @@ BuiltInTypeMap &GetMethodMap() {
|
|||
{"squeeze", std::string("squeeze")}, // P.squeeze()
|
||||
{"astype", std::string("astype")}, // P.cast()
|
||||
{"__bool__", std::string("tensor_bool")}, // C.tensor_bool
|
||||
{"argmax", std::string("argmax")}, // P.Argmax()
|
||||
{"argmin", std::string("argmin")}, // P.Argmax()
|
||||
}},
|
||||
{kObjectTypeRowTensorType,
|
||||
{
|
||||
|
|
|
@ -484,6 +484,21 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Tensor, has the same dimension as input tensor, with axes suitably permuted.
|
||||
|
||||
Raises:
|
||||
TypeError: If input arguments have types not specified above.
|
||||
ValueError: If the number of `axes` is not euqal to a.ndim.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((1,2,3), dtype=np.float32))
|
||||
>>> x = x.transpose()
|
||||
>>> print(x.shape)
|
||||
(3, 2, 1)
|
||||
"""
|
||||
self.init_check()
|
||||
perm = validator.check_transpose_axis(axes, self.ndim)
|
||||
|
@ -501,6 +516,23 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Tensor, with new specified shape.
|
||||
|
||||
Raises:
|
||||
TypeError: If new_shape is not integer, list or tuple, or `x` is not tensor.
|
||||
ValueError: If new_shape is not compatible with the original shape.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> from mindspore import Tensor
|
||||
>>> from mindspore import dtype as mstype
|
||||
>>> x = Tensor([[-0.1, 0.3, 3.6], [0.4, 0.5, -3.2]], dtype=mstype.float32)
|
||||
>>> output = np.reshape(x, (3, 2))
|
||||
>>> print(output)
|
||||
[[-0.1 0.3]
|
||||
[ 3.6 0.4]
|
||||
[ 0.5 -3.2]]
|
||||
"""
|
||||
self.init_check()
|
||||
new_shape = validator.check_reshape_shp(shape)
|
||||
|
@ -512,6 +544,17 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Tensor, a 1-D tensor, containing the same elements of the input.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((2,3,4), dtype=np.float32))
|
||||
>>> output = x.ravel()
|
||||
>>> print(output.shape)
|
||||
(24,)
|
||||
"""
|
||||
self.init_check()
|
||||
reshape_op = tensor_operator_registry.get('reshape')()
|
||||
|
@ -528,6 +571,21 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Tensor, has the same data type as input.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
TypeError: If `order` is not string type.
|
||||
ValueError: If `order` is string type, but not 'C' or 'F'.
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((2,3,4), dtype=np.float32))
|
||||
>>> output = x.flatten()
|
||||
>>> print(output.shape)
|
||||
(24,)
|
||||
"""
|
||||
self.init_check()
|
||||
reshape_op = tensor_operator_registry.get('reshape')()
|
||||
|
@ -550,6 +608,21 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Transposed tensor, has the same data type as the input.
|
||||
|
||||
Raises:
|
||||
TypeError: If `axis1` or `axis2` is not integer.
|
||||
ValueError: If `axis1` or `axis2` is not in the range of :math:`[-ndim, ndim-1]`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((2,3,4), dtype=np.float32))
|
||||
>>> output = np.swapaxes(x, 0, 2)
|
||||
>>> print(output.shape)
|
||||
(4,3,2)
|
||||
"""
|
||||
self.init_check()
|
||||
axis1, axis2 = validator.check_swapaxes_axis((axis1, axis2), self.ndim)
|
||||
|
@ -579,6 +652,21 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Tensor, with all or a subset of the dimensions of length 1 removed.
|
||||
|
||||
Raises:
|
||||
TypeError: If input arguments have types not specified above.
|
||||
ValueError: If specified axis has shape entry :math:`> 1`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((1,2,2,1), dtype=np.float32))
|
||||
>>> x = x.squeeze()
|
||||
>>> print(x.shape)
|
||||
(2, 2)
|
||||
"""
|
||||
self.init_check()
|
||||
if axis is None:
|
||||
|
@ -600,6 +688,20 @@ class Tensor(Tensor_):
|
|||
|
||||
Returns:
|
||||
Tensor, with the designated dtype.
|
||||
|
||||
Raises:
|
||||
TypeError: If `dtype` has types not specified above, or values cannot be understood.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> x = Tensor(np.ones((1,2,2,1), dtype=np.float32))
|
||||
>>> x = x.astype("int32")
|
||||
>>> print(x.dtype)
|
||||
Int32
|
||||
"""
|
||||
self.init_check()
|
||||
dtype = validator.check_astype_dtype(dtype)
|
||||
|
@ -607,6 +709,77 @@ class Tensor(Tensor_):
|
|||
return self
|
||||
return tensor_operator_registry.get('cast')(self, dtype)
|
||||
|
||||
def argmax(self, axis=None):
|
||||
"""
|
||||
Returns the indices of the maximum values along an axis.
|
||||
|
||||
Args:
|
||||
axis (int, optional): By default, the index is into
|
||||
the flattened array, otherwise along the specified axis.
|
||||
|
||||
Returns:
|
||||
Tensor, array of indices into the array. It has the same
|
||||
shape as a.shape with the dimension along axis removed.
|
||||
|
||||
Raises:
|
||||
ValueError: if axis is out of range.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> a = Tensor(np.arange(10, 16).reshape(2, 3).astype("float32"))
|
||||
>>> print(np.argmax(a))
|
||||
5
|
||||
"""
|
||||
# P.Argmax only supports float
|
||||
a = self.astype(mstype.float32)
|
||||
if axis is None:
|
||||
a = a.ravel()
|
||||
axis = 0
|
||||
else:
|
||||
axis = validator.check_axis_in_range(axis, a.ndim)
|
||||
return tensor_operator_registry.get('argmax')(axis)(a)
|
||||
|
||||
def argmin(self, axis=None):
|
||||
"""
|
||||
Returns the indices of the minimum values along an axis.
|
||||
|
||||
Args:
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input array.
|
||||
axis (int, optional): By default, the index is into
|
||||
the flattened array, otherwise along the specified axis.
|
||||
|
||||
Returns:
|
||||
Tensor, array of indices into the array. It has the same
|
||||
shape as a.shape with the dimension along axis removed.
|
||||
|
||||
Raises:
|
||||
ValueError: if axis is out of range.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import numpy as np
|
||||
>>> from mindspore import Tensor
|
||||
>>> a = Tensor(np.arange(10, 16).reshape(2, 3).astype("float32"))
|
||||
>>> print(np.argmin(a))
|
||||
0
|
||||
"""
|
||||
# P.Argmax only supports float
|
||||
a = self.astype(mstype.float32)
|
||||
if axis is None:
|
||||
a = a.ravel()
|
||||
axis = 0
|
||||
else:
|
||||
axis = validator.check_axis_in_range(axis, a.ndim)
|
||||
# P.Argmin is currently not supported
|
||||
return tensor_operator_registry.get('argmax')(axis)(tensor_operator_registry.get('__neg__')(a))
|
||||
|
||||
|
||||
def init_check(self):
|
||||
if self.has_init:
|
||||
self.init_data()
|
||||
|
|
|
@ -31,15 +31,18 @@ from .array_ops import (transpose, expand_dims, squeeze, rollaxis, swapaxes, res
|
|||
column_stack, hstack, dstack, vstack, stack, unique, moveaxis,
|
||||
tile, broadcast_to, broadcast_arrays, roll, append, split, vsplit,
|
||||
flip, flipud, fliplr, hsplit, dsplit, take_along_axis, take, repeat,
|
||||
rot90, select, array_split)
|
||||
rot90, select, array_split, choose, size, array_str, apply_along_axis,
|
||||
piecewise, unravel_index, apply_over_axes)
|
||||
from .array_creations import copy_ as copy
|
||||
from .array_creations import (array, asarray, asfarray, ones, zeros, full, arange,
|
||||
linspace, logspace, eye, identity, empty, empty_like,
|
||||
ones_like, zeros_like, full_like, diagonal, tril, triu,
|
||||
tri, trace, meshgrid, mgrid, ogrid, diagflat,
|
||||
diag, diag_indices, ix_, indices, geomspace, vander)
|
||||
diag, diag_indices, ix_, indices, geomspace, vander, hamming,
|
||||
hanning, bartlett, blackman, triu_indices, tril_indices,
|
||||
triu_indices_from, tril_indices_from, histogram_bin_edges, pad)
|
||||
from .dtypes import (int_, int8, int16, int32, int64, uint, uint8, uint16,
|
||||
uint32, uint64, float_, float16, float32, float64, bool_, inf, nan,
|
||||
uint32, uint64, float_, float16, float32, float64, bool_, inf, nan, pi,
|
||||
numeric_types, PINF, NINF)
|
||||
from .math_ops import (mean, inner, add, subtract, multiply, divide, true_divide, power,
|
||||
dot, outer, tensordot, absolute, std, var, average, minimum,
|
||||
|
@ -50,31 +53,43 @@ from .math_ops import (mean, inner, add, subtract, multiply, divide, true_divide
|
|||
cross, ceil, trapz, gcd, lcm, convolve, log1p, logaddexp, log2,
|
||||
logaddexp2, log10, ediff1d, nansum, nanmean, nanvar, nanstd, cumsum, nancumsum,
|
||||
sin, cos, tan, arcsin, arccos, arctan, sinh, cosh, tanh, arcsinh, arccosh,
|
||||
arctanh, arctan2, cov)
|
||||
arctanh, arctan2, cov, multi_dot, nanmax, nanmin, argmax, argmin, searchsorted,
|
||||
interp, sum_, corrcoef, gradient, sign, copysign, digitize, bincount, histogram,
|
||||
histogramdd, histogram2d, matrix_power, around, polyadd, polysub, polyval,
|
||||
polyder, polymul, polyint, result_type, unwrap, cumprod, ravel_multi_index,
|
||||
norm, bitwise_and, bitwise_or, bitwise_xor, invert, rint, correlate, radians)
|
||||
from .logic_ops import (not_equal, less_equal, less, greater_equal, greater, equal, isfinite,
|
||||
isnan, isinf, isposinf, isneginf, isscalar, logical_and, logical_not,
|
||||
logical_or, logical_xor, in1d, isin, isclose)
|
||||
logical_or, logical_xor, in1d, isin, isclose, signbit, sometrue,
|
||||
array_equal, array_equiv)
|
||||
|
||||
mod = remainder
|
||||
fabs = absolute
|
||||
round = around # pylint: disable=redefined-builtin
|
||||
divmod = divmod_ # pylint: disable=redefined-builtin
|
||||
del divmod_
|
||||
abs = absolute # pylint: disable=redefined-builtin
|
||||
max = amax # pylint: disable=redefined-builtin
|
||||
min = amin # pylint: disable=redefined-builtin
|
||||
|
||||
sum = sum_ # pylint: disable=redefined-builtin
|
||||
del sum_
|
||||
bitwise_not = invert
|
||||
|
||||
array_ops_module = ['transpose', 'expand_dims', 'squeeze', 'rollaxis', 'swapaxes', 'reshape',
|
||||
'ravel', 'concatenate', 'where', 'atleast_1d', 'atleast_2d', 'atleast_3d',
|
||||
'column_stack', 'hstack', 'dstack', 'vstack', 'stack', 'unique', 'moveaxis',
|
||||
'tile', 'broadcast_to', 'broadcast_arrays', 'append', 'roll', 'split', 'vsplit',
|
||||
'flip', 'flipud', 'fliplr', 'hsplit', 'dsplit', 'take_along_axis', 'take',
|
||||
'repeat', 'rot90', 'select', 'array_split']
|
||||
'repeat', 'rot90', 'select', 'array_split', 'choose', 'size', 'array_str',
|
||||
'apply_along_axis', 'piecewise', 'unravel_index', 'apply_over_axes']
|
||||
|
||||
array_creations_module = ['array', 'asarray', 'asfarray', 'ones', 'zeros', 'full', 'arange',
|
||||
'linspace', 'logspace', 'eye', 'identity', 'empty', 'empty_like',
|
||||
'ones_like', 'zeros_like', 'full_like', 'diagonal', 'tril', 'triu',
|
||||
'tri', 'trace', 'meshgrid', 'mgrid', 'ogrid', 'diagflat', 'diag',
|
||||
'diag_indices', 'ix_', 'indices', 'geomspace', 'vander']
|
||||
'diag_indices', 'ix_', 'indices', 'geomspace', 'vander', 'hamming',
|
||||
'hanning', 'bartlett', 'blackman', 'triu_indices', 'tril_indices',
|
||||
'triu_indices_from', 'tril_indices_from', 'histogram_bin_edges', 'pad']
|
||||
|
||||
math_module = ['mean', 'inner', 'add', 'subtract', 'multiply', 'divide', 'true_divide', 'power',
|
||||
'dot', 'outer', 'tensordot', 'absolute', 'std', 'var', 'average', 'not_equal',
|
||||
|
@ -86,11 +101,17 @@ math_module = ['mean', 'inner', 'add', 'subtract', 'multiply', 'divide', 'true_d
|
|||
'abs', 'max', 'min', 'gcd', 'lcm', 'log1p', 'logaddexp', 'log2', 'logaddexp2', 'log10',
|
||||
'convolve', 'ediff1d', 'nansum', 'nanmean', 'nanvar', 'nanstd', 'cumsum',
|
||||
'nancumsum', 'sin', 'cos', 'tan', 'arcsin', 'arccos', 'arctan', 'sinh', 'cosh', 'tanh',
|
||||
'arcsinh', 'arccosh', 'arctanh', 'arctan2', 'cov']
|
||||
'arcsinh', 'arccosh', 'arctanh', 'arctan2', 'cov', 'multi_dot', 'nanmax', 'nanmin',
|
||||
'argmax', 'argmin', 'searchsorted', 'interp', 'sum', 'corrcoef', 'gradient', 'sign',
|
||||
'copysign', 'radians', 'digitize', 'bincount', 'histogram', 'histogramdd', 'histogram2d',
|
||||
'polyadd', 'polysub', 'polyval', 'polyder', 'polymul', 'polyint', 'result_type',
|
||||
'unwrap', 'cumprod', 'ravel_multi_index', 'norm', 'bitwise_and', 'bitwise_or',
|
||||
'bitwise_xor', 'invert', 'bitwise_not', 'rint', "correlate"]
|
||||
|
||||
logic_module = ['not_equal', 'less_equal', 'less', 'greater_equal', 'greater', 'equal', 'isfinite',
|
||||
'isnan', 'isinf', 'isposinf', 'isneginf', 'isscalar', 'logical_and', 'logical_not',
|
||||
'logical_or', 'logical_xor', 'in1d', 'isin', 'isclose']
|
||||
'logical_or', 'logical_xor', 'in1d', 'isin', 'isclose', 'signbit', 'sometrue',
|
||||
'array_equal', 'array_equiv']
|
||||
|
||||
__all__ = array_ops_module + array_creations_module + math_module + logic_module + numeric_types
|
||||
|
||||
|
|
|
@ -13,10 +13,14 @@
|
|||
# limitations under the License.
|
||||
# ============================================================================
|
||||
"""array operations, the function docs are adapted from Numpy API."""
|
||||
import math
|
||||
import operator
|
||||
|
||||
import numpy as onp
|
||||
|
||||
from ..common import Tensor
|
||||
from ..common import dtype as mstype
|
||||
from ..ops import operations as P
|
||||
from ..ops import functional as F
|
||||
from ..ops.primitive import constexpr
|
||||
from ..nn.layer.basic import tril as nn_tril
|
||||
|
@ -25,13 +29,15 @@ from .._c_expression import Tensor as Tensor_
|
|||
|
||||
from .utils import _check_input_for_asarray, _deep_list, _deep_tensor_to_nparray, \
|
||||
_broadcast_to_shape, _check_input_tensor, _convert_64_to_32, _get_dtype_from_scalar, \
|
||||
_expand
|
||||
_expand, _to_tensor, _slice_along_axis, _callable
|
||||
from .utils_const import _raise_value_error, _empty, _check_axis_valid, _max, _min, \
|
||||
_check_same_type, _is_shape_empty, _check_shape, _check_dtype, _tile_size, _abs, \
|
||||
_raise_type_error, _expanded_shape, _check_is_float, _iota, _type_convert, \
|
||||
_canonicalize_axis, _list_comprehensions, _ceil, _tuple_getitem, _tuple_slice
|
||||
from .array_ops import transpose, ravel, concatenate, broadcast_arrays, reshape, broadcast_to
|
||||
from .dtypes import nan
|
||||
_canonicalize_axis, _list_comprehensions, _ceil, _tuple_slice, _raise_unimplemented_error, \
|
||||
_tuple_setitem
|
||||
from .array_ops import transpose, ravel, concatenate, broadcast_arrays, reshape, broadcast_to, flip, \
|
||||
apply_along_axis, where
|
||||
from .dtypes import nan, pi
|
||||
|
||||
# According to official numpy reference, the dimension of a numpy array must be less
|
||||
# than 32
|
||||
|
@ -39,6 +45,9 @@ MAX_NUMPY_DIMS = 32
|
|||
# All types that can be accepted as "array_like" parameters in graph mode.
|
||||
ARRAY_TYPES = (int, float, bool, list, tuple, Tensor)
|
||||
|
||||
_reduce_min_keepdims = P.ReduceMin(True)
|
||||
_reduce_max_keepdims = P.ReduceMax(True)
|
||||
_reduce_mean_keepdims = P.ReduceMean(True)
|
||||
|
||||
def array(obj, dtype=None, copy=True, ndmin=0):
|
||||
"""
|
||||
|
@ -255,6 +264,7 @@ def copy_(a):
|
|||
a = a.astype(origin_dtype)
|
||||
return a
|
||||
|
||||
|
||||
def ones(shape, dtype=mstype.float32):
|
||||
"""
|
||||
Returns a new tensor of given shape and type, filled with ones.
|
||||
|
@ -626,7 +636,7 @@ def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0):
|
|||
num, endpoint=endpoint, dtype=dtype, axis=axis)
|
||||
shape = F.shape(bases)
|
||||
axis = axis + F.rank(bases) + 1 if axis < 0 else axis
|
||||
expanded_shape = _tuple_getitem(shape, axis, False) + (1,) + _tuple_getitem(shape, axis)
|
||||
expanded_shape = _tuple_slice(shape, None, axis) + (1,) + _tuple_slice(shape, axis, None)
|
||||
bases = F.reshape(bases, expanded_shape)
|
||||
start = F.reshape(start, expanded_shape)
|
||||
res = F.tensor_mul(F.tensor_pow(bases, exponents), start)
|
||||
|
@ -1768,7 +1778,7 @@ def indices(dimensions, dtype=mstype.int32, sparse=False):
|
|||
|
||||
Args:
|
||||
dimensions (tuple or list of ints): The shape of the grid.
|
||||
dtype (data type, optional): Data type of the result.
|
||||
dtype (:class:`mindspore.dtype`, optional): Data type of the result.
|
||||
sparse (boolean, optional): Defaults to False. Return a sparse
|
||||
representation of the grid instead of a dense representation.
|
||||
|
||||
|
@ -1801,3 +1811,724 @@ def indices(dimensions, dtype=mstype.int32, sparse=False):
|
|||
for d in dimensions:
|
||||
grids += (arange(d, dtype=dtype),)
|
||||
return meshgrid(*grids, sparse=sparse, indexing='ij')
|
||||
|
||||
|
||||
def _check_window_size(x):
|
||||
"""Returns True if window size is greater than 1."""
|
||||
if not isinstance(x, int):
|
||||
_raise_type_error('the number fo points should be an int')
|
||||
return x > 1
|
||||
|
||||
|
||||
def bartlett(M):
|
||||
"""
|
||||
Returns the Bartlett window.
|
||||
The Bartlett window is very similar to a triangular window, except that the
|
||||
end points are at zero. It is often used in signal processing for tapering a
|
||||
signal, without generating too much ripple in the frequency domain.
|
||||
|
||||
Args:
|
||||
M (int): Number of points in the output window. If zero or less, an empty
|
||||
array is returned.
|
||||
|
||||
Returns:
|
||||
Tensor, the triangular window, with the maximum value normalized to one
|
||||
(the value one appears only if the number of samples is odd), with the
|
||||
first and last samples equal to zero.
|
||||
|
||||
Raises:
|
||||
TypeError: if `M` is not an int.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.bartlett(12))
|
||||
[0. 0.18181819 0.36363637 0.5454545 0.72727275 0.9090909
|
||||
0.9090909 0.72727275 0.5454545 0.36363637 0.18181819 0. ]
|
||||
"""
|
||||
if not _check_window_size(M):
|
||||
return ones(_max(0, M))
|
||||
n = _iota(mstype.float32, M)
|
||||
m_minus_one = _to_tensor(M - 1)
|
||||
return _to_tensor(1) - F.absolute(_to_tensor(2)*n - m_minus_one)/m_minus_one
|
||||
|
||||
|
||||
def blackman(M):
|
||||
"""
|
||||
Returns the Blackman window.
|
||||
The Blackman window is a taper formed by using the first three terms of a
|
||||
summation of cosines. It was designed to have close to the minimal leakage
|
||||
possible. It is close to optimal, only slightly worse than a Kaiser window.
|
||||
|
||||
Args:
|
||||
M (int): Number of points in the output window. If zero or less, an empty
|
||||
array is returned.
|
||||
|
||||
Returns:
|
||||
Tensor, the window, with the maximum value normalized to one (the value
|
||||
one appears only if the number of samples is odd).
|
||||
|
||||
Raises:
|
||||
TypeError: if `M` is not an int.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.hamming(12))
|
||||
[0.08000001 0.15302339 0.34890914 0.6054648 0.841236 0.9813669
|
||||
0.9813668 0.8412359 0.6054647 0.34890908 0.15302327 0.08000001]
|
||||
"""
|
||||
if not _check_window_size(M):
|
||||
return ones(_max(0, M))
|
||||
n_doubled = arange(1 - M, M, 2, dtype=mstype.float32)
|
||||
return (_to_tensor(0.42) + _to_tensor(0.5)*F.cos(_to_tensor(pi/(M - 1))*n_doubled) +
|
||||
_to_tensor(0.08)*F.cos(_to_tensor(2*pi/(M - 1))*n_doubled))
|
||||
|
||||
|
||||
def hamming(M):
|
||||
"""
|
||||
Returns the Hamming window.
|
||||
The Hamming window is a taper formed by using a weighted cosine.
|
||||
|
||||
Args:
|
||||
M (int): Number of points in the output window. If zero or less, an empty
|
||||
array is returned.
|
||||
|
||||
Returns:
|
||||
Tensor, the window, with the maximum value normalized to one (the value
|
||||
one appears only if the number of samples is odd).
|
||||
|
||||
Raises:
|
||||
TypeError: if `M` is not an int.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.hamming(12))
|
||||
[0.08000001 0.15302339 0.34890914 0.6054648 0.841236 0.9813669
|
||||
0.9813668 0.8412359 0.6054647 0.34890908 0.15302327 0.08000001]
|
||||
"""
|
||||
if not _check_window_size(M):
|
||||
return ones(_max(0, M))
|
||||
n = _iota(mstype.float32, M)
|
||||
return _to_tensor(0.54) - _to_tensor(0.46)*F.cos(_to_tensor(2*pi/(M - 1))*n)
|
||||
|
||||
|
||||
def hanning(M):
|
||||
"""
|
||||
Returns the Hanning window.
|
||||
The Hanning window is a taper formed by using a weighted cosine.
|
||||
|
||||
Args:
|
||||
M (int): Number of points in the output window. If zero or less, an empty
|
||||
array is returned.
|
||||
|
||||
Returns:
|
||||
Tensor, the window, with the maximum value normalized to one (the value
|
||||
one appears only if the number of samples is odd).
|
||||
|
||||
Raises:
|
||||
TypeError: if `M` is not an int.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.hanning(12))
|
||||
[0. 0.07937324 0.29229254 0.5711574 0.8274304 0.9797465
|
||||
0.97974646 0.82743025 0.5711573 0.29229245 0.07937312 0. ]
|
||||
"""
|
||||
if not _check_window_size(M):
|
||||
return ones(_max(0, M))
|
||||
n = _iota(mstype.float32, M)
|
||||
return _to_tensor(0.5) - _to_tensor(0.5)*F.cos(_to_tensor(2*pi/(M - 1))*n)
|
||||
|
||||
|
||||
@constexpr
|
||||
def tri_indices(n, k=0, m=None, upper=True):
|
||||
"""Returns triu/tril indices in o(nm) time."""
|
||||
if not isinstance(n, (int, float, bool)):
|
||||
raise TypeError("Input n must be a number.")
|
||||
if not isinstance(k, (int, float, bool)):
|
||||
raise TypeError("Input k must be a number.")
|
||||
if m is None:
|
||||
m = n
|
||||
elif not isinstance(m, (int, float, bool)):
|
||||
raise TypeError("Input m must be a number.")
|
||||
if upper:
|
||||
compare = operator.ge
|
||||
else:
|
||||
compare = operator.le
|
||||
x_coordinate = []
|
||||
y_coordinate = []
|
||||
# math.ceil is used to match numpy's behaviour
|
||||
for i in range(math.ceil(n)):
|
||||
curr_limit = i + k
|
||||
for j in range(math.ceil(m)):
|
||||
if compare(j, curr_limit):
|
||||
x_coordinate.append(i)
|
||||
y_coordinate.append(j)
|
||||
return asarray_const(x_coordinate), asarray_const(y_coordinate)
|
||||
|
||||
|
||||
def triu_indices(n, k=0, m=None):
|
||||
"""
|
||||
Returns the indices for the upper-triangle of an (n, m) array.
|
||||
|
||||
Args:
|
||||
n (int): The size of the arrays for which the returned indices will be valid.
|
||||
k (int, optional): Diagonal offset.
|
||||
m (int, optional): The column dimension of the arrays for which the returned
|
||||
arrays will be valid. By default `m` is taken equal to `n`.
|
||||
|
||||
Returns:
|
||||
The indices for the triangle. The returned tuple contains two tensors, each
|
||||
with the indices along one dimension of the tensor.
|
||||
|
||||
Raises:
|
||||
TypeError: if `n`, `k`, `m` are not numbers.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.triu_indices(3))
|
||||
(Tensor(shape=[6], dtype=Int32, value= [0, 0, 0, 1, 1, 2]),
|
||||
Tensor(shape=[6], dtype=Int32, value= [0, 1, 2, 1, 2, 2]))
|
||||
"""
|
||||
return tri_indices(n, k, m, True)
|
||||
|
||||
|
||||
def tril_indices(n, k=0, m=None):
|
||||
"""
|
||||
Returns the indices for the lower-triangle of an (n, m) array.
|
||||
|
||||
Args:
|
||||
n (int): The size of the arrays for which the returned indices will be valid.
|
||||
k (int, optional): Diagonal offset.
|
||||
m (int, optional): The column dimension of the arrays for which the returned
|
||||
arrays will be valid. By default `m` is taken equal to `n`.
|
||||
|
||||
Returns:
|
||||
The indices for the triangle. The returned tuple contains two tensors, each
|
||||
with the indices along one dimension of the tensor.
|
||||
|
||||
Raises:
|
||||
TypeError: if `n`, `k`, `m` are not numbers.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.tril_indices(3))
|
||||
(Tensor(shape=[6], dtype=Int32, value= [0, 1, 1, 2, 2, 2]),
|
||||
Tensor(shape=[6], dtype=Int32, value= [0, 0, 1, 0, 1, 2]))
|
||||
"""
|
||||
return tri_indices(n, k, m, False)
|
||||
|
||||
|
||||
def triu_indices_from(arr, k=0):
|
||||
"""
|
||||
Returns the indices for the upper-triangle of `arr`.
|
||||
|
||||
Args:
|
||||
arr (Union[Tensor, list, tuple]): 2-dimensional array.
|
||||
k (int, optional): Diagonal offset.
|
||||
|
||||
Returns:
|
||||
triu_indices_from, tuple of 2 tensor, shape(N)
|
||||
Indices for the upper-triangle of `arr`.
|
||||
|
||||
Raises:
|
||||
TypeError: if `arr` cannot be converted to tensor, or `k` is not a number.
|
||||
ValueError: if `arr` cannot be converted to a 2-dimensional tensor.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> tensor = np.ones((3,3))
|
||||
>>> print(np.triu_indices_from(tensor))
|
||||
(Tensor(shape=[6], dtype=Int32, value= [0, 0, 0, 1, 1, 2]),
|
||||
Tensor(shape=[6], dtype=Int32, value= [0, 1, 2, 1, 2, 2]))
|
||||
"""
|
||||
arr = asarray(arr)
|
||||
if arr.ndim != 2:
|
||||
_raise_value_error("input array must be 2-d")
|
||||
return triu_indices(arr.shape[-2], k=k, m=arr.shape[-1])
|
||||
|
||||
|
||||
def tril_indices_from(arr, k=0):
|
||||
"""
|
||||
Returns the indices for the lower-triangle of `arr`.
|
||||
|
||||
Args:
|
||||
arr (Union[Tensor, list, tuple]): 2-dimensional array.
|
||||
k (int, optional): Diagonal offset.
|
||||
|
||||
Returns:
|
||||
triu_indices_from, tuple of 2 tensor, shape(N)
|
||||
Indices for the upper-triangle of `arr`.
|
||||
|
||||
Raises:
|
||||
TypeError: if `arr` cannot be converted to tensor, or `k` is not a number.
|
||||
ValueError: if `arr` cannot be converted to a 2-dimensional tensor.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> tensor = np.ones((3,3))
|
||||
>>> print(np.tril_indices_from(tensor))
|
||||
(Tensor(shape=[6], dtype=Int32, value= [0, 1, 1, 2, 2, 2]),
|
||||
Tensor(shape=[6], dtype=Int32, value= [0, 0, 1, 0, 1, 2]))
|
||||
"""
|
||||
arr = asarray(arr)
|
||||
if arr.ndim != 2:
|
||||
_raise_value_error("input array must be 2-d")
|
||||
return tril_indices(arr.shape[-2], k=k, m=arr.shape[-1])
|
||||
|
||||
|
||||
def histogram_bin_edges(a, bins=10, range=None, weights=None): # pylint: disable=redefined-builtin
|
||||
"""
|
||||
Function to calculate only the edges of the bins used by the histogram function.
|
||||
|
||||
Note:
|
||||
String values for `bins` is not supported.
|
||||
|
||||
Args:
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input data. The histogram
|
||||
is computed over the flattened array.
|
||||
bins ((Union[int, tuple, list, Tensor])): If `bins` is an int, it defines the number
|
||||
of equal-width bins in the given range (10, by default). If `bins` is a
|
||||
sequence, it defines the bin edges, including the rightmost edge,
|
||||
allowing for non-uniform bin widths.
|
||||
range((float, float), optional): The lower and upper range of the bins. If
|
||||
not provided, `range` is simply ``(a.min(), a.max())``. Values outside
|
||||
the range are ignored. The first element of the range must be less than
|
||||
or equal to the second.
|
||||
|
||||
Returns:
|
||||
Tensor, the edges to pass into `histogram`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
TypeError: if `bins` is an array and not one-dimensional.
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> arr = np.array([0, 0, 0, 1, 2, 3, 3, 4, 5])
|
||||
>>> print(np.histogram_bin_edges(arr, bins=2))
|
||||
[0. 2.5 5. ]
|
||||
"""
|
||||
if isinstance(bins, (tuple, list, Tensor)):
|
||||
bins = _to_tensor(bins)
|
||||
if F.rank(bins) != 1:
|
||||
_raise_value_error('`bins` must be 1d, when an array')
|
||||
return bins
|
||||
if isinstance(bins, str):
|
||||
# linspace does not support Tensor for num
|
||||
_raise_unimplemented_error('string value for `bins` not implemented')
|
||||
a = _to_tensor(a).ravel().astype(mstype.float32)
|
||||
if range is None:
|
||||
start = F.reduce_min(a)
|
||||
end = F.reduce_max(a)
|
||||
else:
|
||||
start, end = _to_tensor(*range)
|
||||
no_range = (end - start) == 0
|
||||
start = where(no_range, start - 0.5, start)
|
||||
end = where(no_range, end + 0.5, end)
|
||||
return linspace(start, end, bins + 1)
|
||||
|
||||
|
||||
def _pad_empty(arr, pad_width):
|
||||
"""
|
||||
pads the array with constant values, used in mode: "empty"
|
||||
"""
|
||||
dtype = arr.dtype
|
||||
for i in range(arr.ndim):
|
||||
shape = arr.shape
|
||||
pad_before = ()
|
||||
pad_after = ()
|
||||
# To avoid any memory issues, we don't make tensor with 0s in their shapes
|
||||
if pad_width[i][0] > 0:
|
||||
pad_before += (empty(_tuple_setitem(shape, i, pad_width[i][0]), dtype=dtype),)
|
||||
if pad_width[i][1] > 0:
|
||||
pad_after += (empty(_tuple_setitem(shape, i, pad_width[i][1]), dtype=dtype),)
|
||||
tensor_with_pad = pad_before + (arr,) + pad_after
|
||||
arr = concatenate(tensor_with_pad, axis=i)
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_constant(arr, pad_width, value):
|
||||
"""
|
||||
pads the array with constant values, used in mode: "constant"
|
||||
"""
|
||||
dtype = arr.dtype
|
||||
for i in range(arr.ndim):
|
||||
shape = arr.shape
|
||||
pad_before = ()
|
||||
pad_after = ()
|
||||
# To avoid any memory issues, we don't make tensor with 0s in their shapes
|
||||
if pad_width[i][0] > 0:
|
||||
pad_before += (full(_tuple_setitem(shape, i, pad_width[i][0]), value[i][0], dtype=dtype),)
|
||||
if pad_width[i][1] > 0:
|
||||
pad_after += (full(_tuple_setitem(shape, i, pad_width[i][1]), value[i][1], dtype=dtype),)
|
||||
tensor_with_pad = pad_before + (arr,) + pad_after
|
||||
arr = concatenate(tensor_with_pad, axis=i)
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_statistic(arr, pad_width, stat_length, stat_op):
|
||||
"""
|
||||
pads the array with values calculated along the given axis, used in mode: "maximum",
|
||||
"minimum", "mean"
|
||||
"""
|
||||
ndim = arr.ndim
|
||||
shape = arr.shape
|
||||
if stat_length is None:
|
||||
stat_length = _make_stat_length(shape)
|
||||
else:
|
||||
stat_length = _convert_pad_to_nd(stat_length, ndim)
|
||||
stat_length = _limit_stat_length(stat_length, shape)
|
||||
for i in range(ndim):
|
||||
pad_before = stat_op(_slice_along_axis(arr, i, 0, stat_length[i][0]), i)
|
||||
pad_before = (F.tile(pad_before, _tuple_setitem((1,)*ndim, i, pad_width[i][0])),)
|
||||
pad_after = stat_op(_slice_along_axis(arr, i, shape[i]-stat_length[i][1], shape[i]), i)
|
||||
pad_after = (F.tile(pad_after, _tuple_setitem((1,)*ndim, i, pad_width[i][1])),)
|
||||
tensor_with_pad = pad_before + (arr,) + pad_after
|
||||
arr = concatenate(tensor_with_pad, axis=i)
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_edge(arr, pad_width):
|
||||
"""pad_edge is equivalent to pad_statistic with stat_lenght=1, used in mode:"edge"."""
|
||||
def identity_op(arr, axis):
|
||||
return arr
|
||||
return _pad_statistic(arr, pad_width, 1, identity_op)
|
||||
|
||||
|
||||
def _pad_wrap(arr, pad_width):
|
||||
"""The behaviour of wrap mode is consistent with jax.numpy, used in mode:"wrap"."""
|
||||
ndim = arr.ndim
|
||||
shape = arr.shape
|
||||
for i in range(ndim):
|
||||
padsize_before = pad_width[i][0] % shape[i]
|
||||
padsize_after = pad_width[i][1] % shape[i]
|
||||
total_repeats = pad_width[i][0] // shape[i] + 1 + pad_width[i][1] // shape[i]
|
||||
tensor_with_pad = ()
|
||||
# To avoid any memory issues, we don't make tensor with 0s in their shapes
|
||||
if padsize_before > 0:
|
||||
tensor_with_pad += (_slice_along_axis(arr, i, shape[i]-padsize_before, shape[i]),)
|
||||
tensor_with_pad += (F.tile(arr, _tuple_setitem((1,)*ndim, i, total_repeats)),)
|
||||
if padsize_after > 0:
|
||||
tensor_with_pad += (_slice_along_axis(arr, i, 0, padsize_after),)
|
||||
arr = concatenate(tensor_with_pad, axis=i)
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_linear(arr, pad_width, end_values):
|
||||
"""Pads the arr with linear range values, used in mode: "linear_ramp"."""
|
||||
ndim = arr.ndim
|
||||
shape = arr.shape
|
||||
dtype = arr.dtype
|
||||
end_values = _convert_pad_to_nd(end_values, ndim)
|
||||
for i in range(ndim):
|
||||
# shape [..., 1, ...]
|
||||
left_value = _slice_along_axis(arr, i, 0, 1)
|
||||
right_value = _slice_along_axis(arr, i, shape[i]-1, shape[i])
|
||||
pad_before = ()
|
||||
pad_after = ()
|
||||
if pad_width[i][0] > 0:
|
||||
# shape [..., pad_width[i][0], ...]
|
||||
pad_before = (linspace(end_values[i][0], left_value, num=pad_width[i][0],
|
||||
endpoint=False, dtype=dtype, axis=i).squeeze(i+1),)
|
||||
if pad_width[i][1] > 0:
|
||||
# shape [..., pad_width[i][1], ...]
|
||||
pad_after = linspace(right_value, end_values[i][1], num=pad_width[i][1]+1,
|
||||
endpoint=True, dtype=dtype, axis=i).squeeze(i+1)
|
||||
pad_after = (_slice_along_axis(pad_after, i, 1, pad_width[i][1]+1),)
|
||||
tensor_with_pad = pad_before + (arr,) + pad_after
|
||||
arr = concatenate(tensor_with_pad, axis=i)
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_symmetric(arr, pad_width, reflect_type):
|
||||
"""pad the array with symmetric paddings"""
|
||||
for i in range(arr.ndim):
|
||||
array_length = arr.shape[i]
|
||||
|
||||
has_pad_before = (pad_width[i][0] > 0)
|
||||
has_pad_after = (pad_width[i][1] > 0)
|
||||
|
||||
edge_before = _slice_along_axis(arr, i, 0, 1)
|
||||
edge_end = _slice_along_axis(arr, i, array_length-1, array_length)
|
||||
times_to_pad_before = pad_width[i][0] // array_length + 1
|
||||
additional_pad_before = pad_width[i][0] % array_length
|
||||
times_to_pad_after = pad_width[i][1] // array_length + 1
|
||||
additional_pad_after = pad_width[i][1] % array_length
|
||||
curr_pad = None
|
||||
if has_pad_before:
|
||||
# Deal with paddings before the original array
|
||||
for times in range(times_to_pad_before):
|
||||
if times < times_to_pad_before - 1:
|
||||
endpoint = array_length
|
||||
else:
|
||||
endpoint = additional_pad_before
|
||||
if endpoint != 0:
|
||||
curr_pad = _slice_along_axis(arr, i, 0, endpoint)
|
||||
curr_pad = flip(curr_pad, axis=i)
|
||||
if reflect_type == "odd":
|
||||
curr_pad = 2 * edge_before - curr_pad
|
||||
arr = P.Concat(i)((curr_pad, arr))
|
||||
edge_before = _slice_along_axis(arr, i, 0, 1)
|
||||
if has_pad_after:
|
||||
# Deal with paddings after the original array
|
||||
for times in range(times_to_pad_after):
|
||||
if times < times_to_pad_after - 1:
|
||||
startpoint = arr.shape[i] - array_length
|
||||
else:
|
||||
startpoint = arr.shape[i] - additional_pad_after
|
||||
if startpoint != arr.shape[i]:
|
||||
curr_pad = _slice_along_axis(arr, i, startpoint, arr.shape[i])
|
||||
curr_pad = flip(curr_pad, axis=i)
|
||||
if reflect_type == "odd":
|
||||
curr_pad = 2 * edge_end - curr_pad
|
||||
arr = P.Concat(i)((arr, curr_pad))
|
||||
edge_end = _slice_along_axis(arr, i, arr.shape[i]-1, arr.shape[i])
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_reflect(arr, pad_width, reflect_type):
|
||||
"""
|
||||
pad the array with reflect paddings, this is very similar to symmetric paddings,
|
||||
but differs at how edges are selected.
|
||||
"""
|
||||
# pylint: disable=too-many-nested-blocks
|
||||
for i in range(arr.ndim):
|
||||
array_length = arr.shape[i]
|
||||
if array_length == 1:
|
||||
total_repeats = pad_width[i][0] + pad_width[i][1] + 1
|
||||
arr = F.tile(arr, _tuple_setitem((1,)*arr.ndim, i, total_repeats))
|
||||
else:
|
||||
has_pad_before = (pad_width[i][0] > 0)
|
||||
has_pad_after = (pad_width[i][1] > 0)
|
||||
|
||||
edge_before = _slice_along_axis(arr, i, 0, 1)
|
||||
edge_end = _slice_along_axis(arr, i, array_length-1, array_length)
|
||||
pad_size = array_length - 1
|
||||
times_to_pad_before = pad_width[i][0] // pad_size + 1
|
||||
additional_pad_before = pad_width[i][0] % pad_size
|
||||
times_to_pad_after = pad_width[i][1] // pad_size + 1
|
||||
additional_pad_after = pad_width[i][1] % pad_size
|
||||
curr_pad = None
|
||||
if has_pad_before:
|
||||
# Deal with paddings before the original array
|
||||
for times in range(times_to_pad_before):
|
||||
if times < times_to_pad_before - 1:
|
||||
endpoint = array_length
|
||||
else:
|
||||
endpoint = additional_pad_before + 1
|
||||
if endpoint != 1:
|
||||
curr_pad = _slice_along_axis(arr, i, 1, endpoint)
|
||||
curr_pad = flip(curr_pad, axis=i)
|
||||
if reflect_type == "odd":
|
||||
curr_pad = 2 * edge_before - curr_pad
|
||||
arr = P.Concat(i)((curr_pad, arr))
|
||||
edge_before = _slice_along_axis(arr, i, 0, 1)
|
||||
if has_pad_after:
|
||||
# Deal with paddings after the original array
|
||||
for times in range(times_to_pad_after):
|
||||
if times < times_to_pad_after - 1:
|
||||
startpoint = arr.shape[i] - array_length
|
||||
else:
|
||||
startpoint = arr.shape[i] - additional_pad_after - 1
|
||||
if startpoint != arr.shape[i]-1:
|
||||
curr_pad = _slice_along_axis(arr, i, startpoint, arr.shape[i]-1)
|
||||
curr_pad = flip(curr_pad, axis=i)
|
||||
if reflect_type == "odd":
|
||||
curr_pad = 2 * edge_end - curr_pad
|
||||
arr = P.Concat(i)((arr, curr_pad))
|
||||
edge_end = _slice_along_axis(arr, i, arr.shape[i]-1, arr.shape[i])
|
||||
return arr
|
||||
|
||||
|
||||
def _pad_func(arr, pad_width, func, **kwargs):
|
||||
"""applies padding function over different axis."""
|
||||
# first creates a padded array with fixed length.
|
||||
arr_dim = arr.ndim
|
||||
pad_width = _convert_pad_to_nd(pad_width, arr_dim)
|
||||
arr = _pad_empty(arr, pad_width)
|
||||
for i in range(arr_dim):
|
||||
# function signature: padding_func(tensor, iaxis_pad_width, iaxis, kwargs)
|
||||
arr = apply_along_axis(func, i, arr, pad_width[i], i, kwargs)
|
||||
return arr
|
||||
|
||||
|
||||
@constexpr
|
||||
def _make_stat_length(shape):
|
||||
"""converts the stat_length values."""
|
||||
return tuple((shape[i], shape[i]) for i, _ in enumerate(shape))
|
||||
|
||||
|
||||
@constexpr
|
||||
def _limit_stat_length(stat_length, shape):
|
||||
"""limits the stat_length to current array length along given dimension."""
|
||||
return tuple((min(stat_pair[0], shape[i]), min(stat_pair[1], shape[i])) for i, stat_pair in enumerate(stat_length))
|
||||
|
||||
|
||||
@constexpr
|
||||
def _convert_pad_to_nd(pad_values, ndim):
|
||||
"""broadcasts the pad_values to (ndim * 2)"""
|
||||
if not isinstance(pad_values, (int, list, tuple, Tensor)):
|
||||
raise TypeError(
|
||||
"pad_width, stat_length, constant_values or end_values should only be int, list, tuple or tensor")
|
||||
pad_tensor = _to_tensor(pad_values)
|
||||
pad_shape = pad_tensor.shape
|
||||
if not pad_shape:
|
||||
pad_values = tuple((((pad_values,) * 2) for i in range(ndim)))
|
||||
elif pad_shape == (1,):
|
||||
pad_values = tuple((tuple(pad_values) * 2) for i in range(ndim))
|
||||
elif pad_shape == (2,):
|
||||
pad_values = tuple(tuple(pad_values) for i in range(ndim))
|
||||
elif pad_shape == (1, 2):
|
||||
pad_values = tuple(tuple(pad_values[0]) for i in range(ndim))
|
||||
elif pad_shape == (ndim, 2):
|
||||
pad_values = tuple(tuple(pad_pair) for pad_pair in pad_values)
|
||||
else:
|
||||
raise ValueError(f"input values must be able to broadcast to {(ndim, 2)}")
|
||||
return pad_values
|
||||
|
||||
|
||||
def pad(arr, pad_width, mode="constant", stat_length=None, constant_values=0,
|
||||
end_values=0, reflect_type="even", **kwargs):
|
||||
"""
|
||||
Pads an array.
|
||||
|
||||
Note:
|
||||
Currently, `median` mode is not supported. `reflect` and `symmetric` mode
|
||||
only supports GPU backend.
|
||||
|
||||
Args:
|
||||
arr (Union[list, tuple, Tensor]): The array to pad.
|
||||
pad_width (Union[int, tuple, list]): Number of values padded to the edges of
|
||||
each axis. :class:`((before_1, after_1), ... (before_N, after_N))` creates
|
||||
unique pad widths for each axis. :class:`((before, after),)` yields same
|
||||
before and after pad for each axis. :class:`(pad,)` or int is a shortcut
|
||||
for :class:`before = after = pad width` for all axes.
|
||||
mode (string, optional):
|
||||
One of the following string values:
|
||||
|
||||
- constant (default): Pads with a constant value.
|
||||
- edge: Pads with the edge values of `arr`.
|
||||
- linear_ramp: Pads with the linear ramp between end_value and the `arr` edge value.
|
||||
- maximum: Pads with the maximum value of all or part of the vector along each axis.
|
||||
- mean: Pads with the mean value of all or part of the vector along each axis.
|
||||
- median: Pads with the median value of all or part of the vector along each axis.
|
||||
- minimum: Pads with the minimum value of all or part of the vector along each axis.
|
||||
- reflect: Pads with the reflection of the vector mirrored on the first
|
||||
and last values of the vector along each axis.
|
||||
- symmetric: Pads with the reflection of the vector mirrored along the edge
|
||||
of the `arr`.
|
||||
- wrap: Pads with the wrap of the vector along the axis. The first values
|
||||
are used to pad the end and the end values are used to pad the beginning.
|
||||
- empty: Pads with undefined values.
|
||||
- <function>: The padding function, if used, should modify and return a new 1-d tensor.
|
||||
It has the following signature: :class:`padding_func(tensor, iaxis_pad_width, iaxis, kwargs)`
|
||||
stat_length (Union[tuple, list, int], optional): Used in \'maximum\', \'mean\',
|
||||
\'median\', and \'minimum\'. Number of values at edge of each axis used
|
||||
to calculate the statistic value. :class:`((before_1, after_1), ... (before_N, after_N))`
|
||||
creates unique statistic lengths for each axis. :class:`((before, after),)`
|
||||
yields same before and after statistic lengths for each axis. :class:`(stat_length,)`
|
||||
or int is a shortcut for :class:`before = after = statistic length` for all
|
||||
axes. Default is :class:`None`, to use the entire axis.
|
||||
constant_values (Union[tuple, list, int], optional):
|
||||
Used in :class:`constant mode`. The values to set the padded values for each
|
||||
axis. :class:`((before_1, after_1), ... (before_N, after_N))` creates unique pad
|
||||
constants for each axis. :class:`((before, after),)` yields same before and
|
||||
after constants for each axis. :class:`(constant,)` or :class:`constant` is
|
||||
a shortcut for :class:`before = after = constant` for all axes. Default is 0.
|
||||
end_values (Union[tuple, list, int], optional): Used in 'linear_ramp'. The values
|
||||
used for the ending value of the linear_ramp and that will form the edge of
|
||||
the padded `arr`. :class:`((before_1, after_1), ... (before_N, after_N))`
|
||||
unique end values for each axis. :class`((before, after),)` yields same before
|
||||
and after end values for each axis. :class:`(constant,)` or :class:`constant`
|
||||
is a shortcut for :class:`before = after = constant` for all axes. Default is 0.
|
||||
reflect_type(string, optional) can choose between \'even\' and \'odd\'. Used in
|
||||
\'reflect\', and \'symmetric\'. The \'even\' style is the default with an
|
||||
unaltered reflection around the edge value. For the \'odd\' style, the extended
|
||||
part of the `arr` is created by subtracting the reflected values from two times
|
||||
the edge value.
|
||||
|
||||
Returns:
|
||||
Padded tensor of rank equal to `arr` with shape increased according to `pad_width`.
|
||||
|
||||
Raises:
|
||||
TypeError: if `arr`, `pad_width`, `stat_length`, `constant_values` or `end_values`
|
||||
have types not specified above.
|
||||
ValueError: if `mode` cannot be recognized, or if `pad_width`, `stat_length`,
|
||||
`constant_values`, `end_values` cannot broadcast to :class:`(arr.ndim, 2)`,
|
||||
or if keyword arguments got unexpected inputs.
|
||||
NotImplementedError: if mode is function or '/median'/.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> tensor = np.array([1., 2., 3., 4., 5.])
|
||||
>>> print(np.pad(tensor, (3, 4)))
|
||||
[0. 0. 0. 1. 2. 3. 4. 5. 0. 0. 0. 0.]
|
||||
>>> print(np.pad(tensor, (3, 4), mode="wrap"))
|
||||
[3. 4. 5. 1. 2. 3. 4. 5. 1. 2. 3. 4.]
|
||||
>>> >>> print(np.pad(tensor, (3, 4), mode="linear_ramp", end_values=(10, 10)))
|
||||
[10. 7. 4. 1. 2. 3. 4. 5. 6.25 7.5 8.75 10. ]
|
||||
"""
|
||||
arr = _to_tensor(arr)
|
||||
if arr.ndim == 0:
|
||||
return arr
|
||||
pad_width = _convert_pad_to_nd(pad_width, arr.ndim)
|
||||
stat_func = {"maximum": _reduce_max_keepdims,
|
||||
"minimum": _reduce_min_keepdims,
|
||||
"mean": _reduce_mean_keepdims,
|
||||
"median": "not implemented"}
|
||||
|
||||
if mode not in ("constant", "maximum", "minimum", "mean", "median", "edge",
|
||||
"wrap", "linear_ramp", "symmetric", "reflect", "empty") and \
|
||||
not _callable(arr, mode):
|
||||
_raise_value_error("Input mode not supported.")
|
||||
|
||||
if mode == "constant":
|
||||
constant_values = _convert_pad_to_nd(constant_values, arr.ndim)
|
||||
return _pad_constant(arr, pad_width, constant_values)
|
||||
if mode in ("maximum", "minimum", "mean", "median"):
|
||||
# TODO: support median mode once P.Sort/P.Median is supported on GPU/CPU
|
||||
if mode == "median":
|
||||
_raise_unimplemented_error("median mode is not supported yet")
|
||||
return _pad_statistic(arr, pad_width, stat_length, stat_func[mode])
|
||||
if mode == "edge":
|
||||
return _pad_edge(arr, pad_width)
|
||||
if mode == "wrap":
|
||||
return _pad_wrap(arr, pad_width)
|
||||
if mode == "linear_ramp":
|
||||
return _pad_linear(arr, pad_width, end_values)
|
||||
if mode == "symmetric":
|
||||
return _pad_symmetric(arr, pad_width, reflect_type)
|
||||
if mode == "reflect":
|
||||
return _pad_reflect(arr, pad_width, reflect_type)
|
||||
if mode == 'empty':
|
||||
return _pad_empty(arr, pad_width)
|
||||
return _pad_func(arr, pad_width, mode, **kwargs)
|
||||
|
|
|
@ -24,14 +24,14 @@ from ..ops.primitive import constexpr
|
|||
from ..nn import Cell
|
||||
|
||||
from .utils import _convert_list_tensor_to_tuple_tensor, _expand, _broadcast_to_shape, \
|
||||
_check_input_tensor, _broadcast_to, _to_tensor
|
||||
_check_input_tensor, _broadcast_to, _to_tensor, _callable
|
||||
from .utils_const import _check_axes_range, _check_start_normalize, \
|
||||
_raise_type_error, _raise_value_error, _infer_out_shape, _empty, _promote, \
|
||||
_check_same_type, _check_axis_valid, _add_unit_axes, _broadcast_tuples, \
|
||||
_check_is_float, _check_axis_in_range, _check_axis_type, _canonicalize_axis, \
|
||||
_list_comprehensions, _check_element_int, _is_shape_empty, _type_convert, \
|
||||
_tuple_getitem, _expanded_shape, _seq_prod, _get_device, _tuple_setitem, \
|
||||
_raise_unimplemented_error
|
||||
_tuple_slice, _expanded_shape, _seq_prod, _tuple_setitem, _iota, \
|
||||
_raise_unimplemented_error, _cumprod, _get_device
|
||||
|
||||
# According to official numpy reference, the dimension of a numpy array must be less
|
||||
# than 32
|
||||
|
@ -697,6 +697,7 @@ def where(condition, x=None, y=None):
|
|||
[7 5]
|
||||
[7 5]]]
|
||||
"""
|
||||
condition, x, y = _to_tensor(condition, x, y)
|
||||
# type promotes input tensors
|
||||
dtype1 = F.dtype(x)
|
||||
dtype2 = F.dtype(y)
|
||||
|
@ -1781,16 +1782,15 @@ def take_along_axis(arr, indices, axis):
|
|||
ndim = F.rank(arr)
|
||||
if ndim != F.rank(indices):
|
||||
_raise_value_error('`indices` and `arr` must have the same number of dimensions')
|
||||
_check_axis_in_range(axis, ndim)
|
||||
axis = axis + ndim if axis < 0 else axis
|
||||
axis = _check_axis_in_range(axis, ndim)
|
||||
|
||||
shape_arr = F.shape(arr)
|
||||
shape_indices = F.shape(indices)
|
||||
# broadcasts indices against the shape of arr except at axis
|
||||
indices = _broadcast_to(indices, _tuple_getitem(shape_indices, axis, False),
|
||||
_tuple_getitem(shape_arr, axis, False), ndim)
|
||||
indices = _broadcast_to(indices, _tuple_getitem(shape_arr, axis + 1, False) +
|
||||
_tuple_getitem(shape_indices, axis + 1), shape_arr, ndim)
|
||||
indices = _broadcast_to(indices, _tuple_slice(shape_indices, None, axis),
|
||||
_tuple_slice(shape_arr, None, axis), ndim)
|
||||
indices = _broadcast_to(indices, _tuple_slice(shape_arr, None, axis + 1) +
|
||||
_tuple_slice(shape_indices, axis + 1, None), shape_arr, ndim)
|
||||
return F.gather_d(arr, axis, indices)
|
||||
|
||||
|
||||
|
@ -1801,18 +1801,21 @@ def _mod(x, y):
|
|||
return F.tensor_sub(x, prod)
|
||||
|
||||
|
||||
def _check_indices(size, indices, mode):
|
||||
def _check_indices(dims, indices, mode, allow_negative_index=True):
|
||||
"""Checks whether indices are out of bounds."""
|
||||
shape = F.shape(indices)
|
||||
dtype = F.dtype(indices)
|
||||
lowerbounds = F.fill(dtype, shape, -size)
|
||||
upperbounds = F.fill(dtype, shape, size - 1)
|
||||
if not allow_negative_index:
|
||||
lowerbounds = F.fill(dtype, shape, 0)
|
||||
else:
|
||||
lowerbounds = F.fill(dtype, shape, -dims)
|
||||
upperbounds = F.fill(dtype, shape, dims - 1)
|
||||
out_of_lowerbounds = F.tensor_lt(indices, lowerbounds)
|
||||
out_of_upperbounds = F.tensor_gt(indices, upperbounds)
|
||||
if mode == 'raise':
|
||||
_raise_unimplemented_error('"raise" mode is not implemented')
|
||||
if mode == 'wrap':
|
||||
return _mod(indices, F.fill(dtype, shape, size))
|
||||
return _mod(indices, F.fill(mstype.float32, shape, dims)).astype(dtype)
|
||||
zeros = F.fill(dtype, shape, 0)
|
||||
clipped = F.select(out_of_lowerbounds, zeros, indices)
|
||||
clipped = F.select(out_of_upperbounds, upperbounds, clipped)
|
||||
|
@ -1878,8 +1881,7 @@ def take(a, indices, axis=None, mode='clip'):
|
|||
a = ravel(a)
|
||||
axis = 0
|
||||
ndim = F.rank(a)
|
||||
_check_axis_in_range(axis, ndim)
|
||||
axis = axis + ndim if axis < 0 else axis
|
||||
axis = _check_axis_in_range(axis, ndim)
|
||||
|
||||
shape_a = F.shape(a)
|
||||
shape_indices = F.shape(indices)
|
||||
|
@ -1887,8 +1889,8 @@ def take(a, indices, axis=None, mode='clip'):
|
|||
indices = _check_indices(shape_a[axis], indices, mode)
|
||||
|
||||
# reshapes indices to shape (Ni..., Nj..., Nk)
|
||||
shape_ni = _tuple_getitem(shape_a, axis, False)
|
||||
shape_nk = _tuple_getitem(shape_a, axis + 1)
|
||||
shape_ni = _tuple_slice(shape_a, None, axis)
|
||||
shape_nk = _tuple_slice(shape_a, axis + 1, None)
|
||||
shape_out = shape_ni + shape_indices + shape_nk
|
||||
shape_indices = _expanded_shape(ndim, size_indices, axis)
|
||||
indices = F.reshape(indices, shape_indices)
|
||||
|
@ -1948,18 +1950,17 @@ def repeat(a, repeats, axis=None):
|
|||
a = ravel(a)
|
||||
axis = 0
|
||||
ndim = F.rank(a)
|
||||
_check_axis_in_range(axis, ndim)
|
||||
axis = axis + ndim if axis < 0 else axis
|
||||
axis = _check_axis_in_range(axis, ndim)
|
||||
if len(repeats) == 1:
|
||||
repeats = repeats[0]
|
||||
if repeats == 0:
|
||||
return _empty(F.dtype(a), (0,))
|
||||
return C.repeat_elements(a, repeats, axis)
|
||||
shape = F.shape(a)
|
||||
size = shape[axis]
|
||||
if len(repeats) != size:
|
||||
dims = shape[axis]
|
||||
if len(repeats) != dims:
|
||||
_raise_value_error('operands could not be broadcast together')
|
||||
subs = split(a, size, axis)
|
||||
subs = split(a, dims, axis)
|
||||
repeated_subs = []
|
||||
for sub, rep in zip(subs, repeats):
|
||||
if rep != 0:
|
||||
|
@ -2046,11 +2047,13 @@ def select(condlist, choicelist, default=0):
|
|||
Returns an array drawn from elements in `choicelist`, depending on conditions.
|
||||
|
||||
Args:
|
||||
condlist (array_like): The list of conditions which determine from which array
|
||||
in `choicelist` the output elements are taken. When multiple conditions are
|
||||
satisfied, the first one encountered in `condlist` is used.
|
||||
choicelist (array_like): The list of arrays from which the output elements are
|
||||
taken. It has to be of the same length as `condlist`.
|
||||
condlist (Union[int, float, bool, list, tuple, Tensor]): The list of conditions
|
||||
which determine from which array in `choicelist` the output elements are
|
||||
taken. When multiple conditions are satisfied, the first one encountered in
|
||||
`condlist` is used.
|
||||
choicelist (Union[int, float, bool, list, tuple, Tensor]): The list of arrays
|
||||
from which the output elements are taken. It has to be of the same length as
|
||||
`condlist`.
|
||||
default (scalar, optional): The element inserted in output when all conditions
|
||||
evaluate to `False`.
|
||||
|
||||
|
@ -2059,7 +2062,6 @@ def select(condlist, choicelist, default=0):
|
|||
`choicelist` where the `m-th` element of the corresponding array in `condlist`
|
||||
is `True`.
|
||||
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
|
@ -2067,7 +2069,9 @@ def select(condlist, choicelist, default=0):
|
|||
ValueError: if ``len(condlist) != len(choicelist)``.
|
||||
|
||||
Examples:
|
||||
>>> condlist = [[True, True, True, False, False], [False, False, True, False, True]]
|
||||
>>> import mindspore.numpy as np
|
||||
>>> condlist = [[True, True, True, False, False], \
|
||||
[False, False, True, False, True]]
|
||||
>>> choicelist = [[0, 1, 2, 3, 4], [0, 1, 4, 9, 16]]
|
||||
>>> output = np.select(condlist, choicelist)
|
||||
>>> print(output)
|
||||
|
@ -2076,32 +2080,481 @@ def select(condlist, choicelist, default=0):
|
|||
condlist, choicelist = _to_tensor(condlist, choicelist)
|
||||
shape_cond = F.shape(condlist)
|
||||
shape_choice = F.shape(choicelist)
|
||||
if F.rank(condlist) == 0 or F.rank(condlist) == 0:
|
||||
if F.rank(condlist) == 0 or F.rank(choicelist) == 0:
|
||||
_raise_value_error('input cannot be scalars')
|
||||
case_num = shape_cond[0]
|
||||
if shape_choice[0] != case_num:
|
||||
_raise_value_error('list of cases must be same length as list of conditions')
|
||||
|
||||
case_size_cond = _tuple_slice(shape_cond, 1, None)
|
||||
case_size_choice = _tuple_slice(shape_choice, 1, None)
|
||||
# performs broadcast over the cases in condlist and choicelist
|
||||
case_size = _infer_out_shape(shape_cond[1:], shape_choice[1:])
|
||||
case_size = _infer_out_shape(case_size_cond, case_size_choice)
|
||||
shape_broadcasted = (case_num,) + case_size
|
||||
ndim = len(shape_broadcasted)
|
||||
shape_cond_expanded = ((case_num,) + _list_comprehensions(ndim - F.rank(condlist), 1, True) +
|
||||
shape_cond[1:])
|
||||
case_size_cond)
|
||||
condlist = _broadcast_to_shape(F.reshape(condlist, shape_cond_expanded), shape_broadcasted)
|
||||
shape_choice_expanded = ((case_num,) + _list_comprehensions(ndim - F.rank(choicelist), 1, True) +
|
||||
shape_choice[1:])
|
||||
case_size_choice)
|
||||
choicelist = _broadcast_to_shape(F.reshape(choicelist, shape_choice_expanded), shape_broadcasted)
|
||||
|
||||
slice_start = _list_comprehensions(ndim - 1, 0, True)
|
||||
slice_size = (1,) + case_size
|
||||
dtype = F.dtype(choicelist)
|
||||
if _get_device() == 'CPU' and not _check_is_float(dtype):
|
||||
# F.tensor_slice only supports float on CPU
|
||||
choicelist = F.cast(choicelist, mstype.float32)
|
||||
default_slice = F.fill(F.dtype(choicelist), slice_size, default)
|
||||
if isinstance(default, Tensor):
|
||||
default_slice = default.astype(F.dtype(choicelist)).reshape(slice_size)
|
||||
else:
|
||||
default_slice = F.fill(F.dtype(choicelist), slice_size, default)
|
||||
for i in range(case_num - 1, -1, -1):
|
||||
cond_slice = F.tensor_slice(condlist.astype(mstype.float32), (i,) + slice_start, slice_size)
|
||||
choice_slice = F.tensor_slice(choicelist, (i,) + slice_start, slice_size)
|
||||
default_slice = F.select(cond_slice.astype(mstype.bool_), choice_slice, default_slice)
|
||||
return F.reshape(default_slice, (case_size)).astype(dtype)
|
||||
|
||||
|
||||
@constexpr
|
||||
def _get_grid(shape):
|
||||
"""Returns a grid representing all the indices for an array with the given shape."""
|
||||
grids = []
|
||||
ndim = len(shape)
|
||||
for i in range(ndim):
|
||||
dim_grid = _iota(mstype.int32, shape[i])
|
||||
dim_shape = _expanded_shape(ndim, shape[i], i)
|
||||
dim_grid = _broadcast_to_shape(dim_grid.reshape(dim_shape), shape)
|
||||
grids.append(dim_grid)
|
||||
return stack(grids, -1)
|
||||
|
||||
|
||||
def choose(a, choices, mode='clip'):
|
||||
"""
|
||||
Construct an array from an index array and a list of arrays to choose from.
|
||||
Given an “index” array `a`` of integers and a sequence of n arrays (choices),
|
||||
`a` and each choice array are first broadcast, as necessary, to arrays of a
|
||||
common shape; calling these `Ba` and `Bchoices[i], i = 0,…,n-1` we have that,
|
||||
necessarily, ``Ba.shape == Bchoices[i].shape`` for each `i`. Then, a new array
|
||||
with ``shape Ba.shape`` is created as follows:
|
||||
|
||||
- if ``mode='raise'`` (the default), then, first of all, each element of `a`
|
||||
(and thus `Ba`) must be in the range `[0, n-1]`; now, suppose that `i`
|
||||
(in that range) is the value at the `(j0, j1, ..., jm)` position in
|
||||
`Ba` - then the value at the same position in the new array is the
|
||||
value in ``Bchoices[i]`` at that same position;
|
||||
|
||||
- if ``mode='wrap'``, values in `a` (and thus `Ba`) may be any (signed)
|
||||
integer; modular arithmetic is used to map integers outside the
|
||||
range ``[0, n-1]`` back into that range; and then the new array is
|
||||
constructed as above;
|
||||
|
||||
- if ``mode='clip'``, values in `a` (and thus `Ba`) may be any (signed) integer;
|
||||
negative integers are mapped to 0; values greater than `n-1` are mapped to
|
||||
`n-1`; and then the new array is constructed as above.
|
||||
|
||||
Note:
|
||||
Numpy argument `out` is not supported.
|
||||
``mode = 'raise'`` is not supported, and the default mode is 'clip' instead.
|
||||
|
||||
Args:
|
||||
a (int array): This array must contain integers in ``[0, n-1]``, where `n` is
|
||||
the number of choices, unless ``mode=wrap`` or ``mode=clip``, in which
|
||||
cases any integers are permissible.
|
||||
choices (sequence of arrays): Choice arrays. `a` and all of the `choices` must
|
||||
be broadcastable to the same shape. If `choices` is itself an array, then
|
||||
its outermost dimension (i.e., the one corresponding to ``choices.shape[0]``)
|
||||
is taken as defining the “sequence”.
|
||||
mode (‘raise’, ‘wrap’, ‘clip’, optional): Specifies how indices outside
|
||||
``[0, n-1]`` will be treated:
|
||||
|
||||
‘raise’ – raise an error (default);
|
||||
|
||||
‘wrap’ – wrap around;
|
||||
|
||||
‘clip’ – clip to the range. ‘clip’ mode means that all indices that are
|
||||
too large are replaced by the index that addresses the last element
|
||||
along that axis. Note that this disables indexing with negative numbers.
|
||||
|
||||
Returns:
|
||||
Tensor, the merged result.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
ValueError: if ``len(condlist) != len(choicelist)``.
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> choices = [[0, 1, 2, 3], [10, 11, 12, 13],
|
||||
[20, 21, 22, 23], [30, 31, 32, 33]]
|
||||
>>> print(np.choose([2, 3, 1, 0], choices))
|
||||
[20 31 12 3]
|
||||
>>> print(np.choose([2, 4, 1, 0], choices, mode='clip'))
|
||||
[20 31 12 3]
|
||||
>>> print(np.choose([2, 4, 1, 0], choices, mode='wrap'))
|
||||
[20 1 12 3]
|
||||
>>> a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
|
||||
>>> choices = [-10, 10]
|
||||
>>> print(np.choose(a, choices))
|
||||
[[ 10 -10 10]
|
||||
[-10 10 -10]
|
||||
[ 10 -10 10]]
|
||||
>>> a = np.array([0, 1]).reshape((2,1,1))
|
||||
>>> c1 = np.array([1, 2, 3]).reshape((1,3,1))
|
||||
>>> c2 = np.array([-1, -2, -3, -4, -5]).reshape((1,1,5))
|
||||
>>> print(np.choose(a, (c1, c2)))
|
||||
[[[ 1 1 1 1 1]
|
||||
[ 2 2 2 2 2]
|
||||
[ 3 3 3 3 3]]
|
||||
|
||||
[[-1 -2 -3 -4 -5]
|
||||
[-1 -2 -3 -4 -5]
|
||||
[-1 -2 -3 -4 -5]]]
|
||||
"""
|
||||
a = _to_tensor(a)
|
||||
if isinstance(choices, (tuple, list)):
|
||||
# broadcasts choices to the same shape if choices is a sequence
|
||||
choices = _to_tensor(*choices)
|
||||
shapes = ()
|
||||
for choice in choices:
|
||||
shapes += (F.shape(choice),)
|
||||
shape_choice = _infer_out_shape(F.shape(a), *shapes)
|
||||
tmp = []
|
||||
for choice in choices:
|
||||
tmp.append(broadcast_to(choice, shape_choice))
|
||||
choices = stack(tmp)
|
||||
else:
|
||||
choices = _to_tensor(choices)
|
||||
shape_choice = _infer_out_shape(F.shape(a), F.shape(choices)[1:])
|
||||
choices = broadcast_to(choices, (F.shape(choices)[0],) + shape_choice)
|
||||
|
||||
if F.rank(a) == 0 or F.rank(choices) == 0:
|
||||
_raise_value_error('input cannot be scalars')
|
||||
a = broadcast_to(a, shape_choice)
|
||||
dtype = F.dtype(choices)
|
||||
# adjusts dtype for F.tensor_mul and F.gather_nd
|
||||
a = a.astype(mstype.int32)
|
||||
choices = choices.astype(mstype.int32)
|
||||
a = _check_indices(F.shape(choices)[0], a, mode, allow_negative_index=False)
|
||||
grid = _get_grid(F.shape(a))
|
||||
indices = concatenate((a.reshape(F.shape(a) + (1,)), grid), -1)
|
||||
return F.gather_nd(choices, indices).astype(dtype)
|
||||
|
||||
|
||||
def size(a, axis=None):
|
||||
"""
|
||||
Returns the number of elements along a given axis.
|
||||
|
||||
Args:
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input data.
|
||||
axis (int): Axis along which the elements are counted. Default: None.
|
||||
If None, give the total number of elements.
|
||||
|
||||
Returns:
|
||||
Number of elements along the specified axis.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
TypeError: If input is not array_like or `axis` is not int or tuple of ints.
|
||||
ValueError: If any axis is out of range or duplicate axes exist.
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> x = np.arange(10).reshape(2, 5).astype('float32')
|
||||
>>> print(np.size(x))
|
||||
10
|
||||
>>> print(np.size(x, axis=1))
|
||||
5
|
||||
"""
|
||||
a = _to_tensor(a)
|
||||
if axis is None:
|
||||
return a.size
|
||||
if not isinstance(axis, int):
|
||||
_raise_type_error("axis argument should be integer.")
|
||||
axis = _canonicalize_axis(axis, a.ndim)
|
||||
return a.shape[axis]
|
||||
|
||||
|
||||
def array_str(a):
|
||||
"""
|
||||
Returns a string representation of the data in an array.
|
||||
|
||||
The data in the array is returned as a single string.
|
||||
This function is similar to array_repr, the difference being that array_repr also
|
||||
returns information on the kind of array and its data type.
|
||||
|
||||
Note:
|
||||
Numpy argument `max_line_width`, `precision` and `suppress_small` are not supported.
|
||||
|
||||
Args:
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input data.
|
||||
|
||||
Returns:
|
||||
String.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
TypeError: If input is not array_like.
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> x = np.arange(5)
|
||||
>>> np.array_str(x)
|
||||
'[0 1 2 3 4]'
|
||||
"""
|
||||
a = _to_tensor(a)
|
||||
return a.__str__()
|
||||
|
||||
|
||||
def apply_along_axis(func1d, axis, arr, *args, **kwargs):
|
||||
"""
|
||||
Applies a function to 1-D slices along the given axis.
|
||||
Executes ``func1d(a, *args, **kwargs)`` where `func1d` operates on 1-D arrays and `a` is a
|
||||
1-D slice of arr along axis.
|
||||
|
||||
Args:
|
||||
func1d (function): Maps `(M,) -> (Nj…)`. This function should accept 1-D arrays. It is
|
||||
applied to 1-D slices of arr along the specified axis.
|
||||
axis (int): Axis along which arr is sliced.
|
||||
arr (Tensor): Input array with shape `(Ni…, M, Nk…)`.
|
||||
args (any): Additional arguments to `func1d`.
|
||||
kwargs (any): Additional named arguments to `func1d`.
|
||||
|
||||
Returns:
|
||||
Tensor with shape `(Ni…, Nj…, Nk…)`, the output array. Its shape is identical to the
|
||||
shape of `arr`, except along the `axis` dimension. This axis is removed, and replaced
|
||||
with new dimensions equal to the shape of the return value of `func1d`. So if `func1d`
|
||||
returns a scalar, the output will have one fewer dimensions than `arr`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
ValueError: if axis is out of the range.
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
|
||||
>>> print(np.apply_along_axis(np.diag, -1, b))
|
||||
[[[1 0 0]
|
||||
[0 2 0]
|
||||
[0 0 3]]
|
||||
|
||||
[[4 0 0]
|
||||
[0 5 0]
|
||||
[0 0 6]]
|
||||
|
||||
[[7 0 0]
|
||||
[0 8 0]
|
||||
[0 0 9]]]
|
||||
"""
|
||||
ndim = F.rank(arr)
|
||||
shape = F.shape(arr)
|
||||
axis = _check_axis_in_range(axis, ndim)
|
||||
arr = moveaxis(arr, axis, -1)
|
||||
arr = F.reshape(arr, (-1, F.shape(arr)[-1]))
|
||||
slices = []
|
||||
for i in range(F.shape(arr)[0]):
|
||||
slices.append(func1d(arr[i], *args, **kwargs))
|
||||
stacked_slices = stack(slices)
|
||||
shape_stacked = (_tuple_slice(shape, None, axis) + _tuple_slice(shape, axis + 1, None) +
|
||||
_tuple_slice(F.shape(stacked_slices), 1, None))
|
||||
res = F.reshape(stacked_slices, shape_stacked)
|
||||
|
||||
# moves the dimensions returned by `func1d` back to `axis`
|
||||
ndim_func = F.rank(res) - ndim + 1
|
||||
if ndim_func >= 1:
|
||||
res = moveaxis(res, F.make_range(ndim - 1, F.rank(res)),
|
||||
F.make_range(axis, axis + ndim_func))
|
||||
return res
|
||||
|
||||
|
||||
def _stack_arrays(arrs):
|
||||
"""Stacks a sequence of Tensor"""
|
||||
if isinstance(arrs, (tuple, list)):
|
||||
tensor_list = []
|
||||
for arr in arrs:
|
||||
tensor_list.append(_to_tensor(arr))
|
||||
return stack(tensor_list)
|
||||
return atleast_1d(_to_tensor(arrs))
|
||||
|
||||
|
||||
def piecewise(x, condlist, funclist, *args, **kw):
|
||||
"""
|
||||
Evaluates a piecewise-defined function.
|
||||
Given a set of conditions and corresponding functions, evaluate each function on the input
|
||||
data wherever its condition is true.
|
||||
|
||||
Args:
|
||||
x (Union[int, float, bool, list, tuple, Tensor]): The input domain.
|
||||
condlist (Union[bool, list of bool Tensor]): Each boolean array corresponds to a
|
||||
function in `funclist`. Wherever `condlist[i]` is True, `funclist[i](x)` is used as
|
||||
the output value. Each boolean array in `condlist` selects a piece of `x`, and
|
||||
should therefore be of the same shape as `x`. The length of `condlist` must
|
||||
correspond to that of `funclist`. If one extra function is given, i.e. if
|
||||
``len(funclist) == len(condlist) + 1``, then that extra function is the default
|
||||
value, used wherever all conditions are false.
|
||||
funclist (Union[list of callables, list of scalars]): Each function is evaluated over
|
||||
`x` wherever its corresponding condition is True. It should take a 1d array as input
|
||||
and give an 1d array or a scalar value as output. If, instead of a callable, a scalar
|
||||
is provided then a constant function ``(lambda x: scalar)`` is assumed.
|
||||
args (any): Any further arguments given to `piecewise` are passed to the functions upon
|
||||
execution, i.e., if called ``piecewise(..., ..., 1, 'a')``, then each function is
|
||||
called as ``f(x, 1, 'a')``.
|
||||
kw (any): Keyword arguments used in calling `piecewise` are passed to the functions upon
|
||||
execution, i.e., if called ``piecewise(..., ..., alpha=1)``, then each function is
|
||||
called as ``f(x, alpha=1)``.
|
||||
|
||||
Returns:
|
||||
Tensor, the output is the same shape and type as `x` and is found by calling the
|
||||
functions in `funclist` on the appropriate portions of `x`, as defined by the boolean
|
||||
arrays in `condlist`. Portions not covered by any condition have a default value of 0.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
ValueError: if length of `funclist` is not in ``(len(condlist), len(condlist) + 1)``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> x = np.linspace(-2.5, 2.5, 6)
|
||||
>>> print(np.piecewise(x, [x < 0, x >= 0], [-1, 1]))
|
||||
[2.5 1.5 0.5 0.5 1.5 2.5]
|
||||
"""
|
||||
x = _to_tensor(x)
|
||||
choicelist = funclist
|
||||
if isinstance(funclist, (tuple, list)):
|
||||
if _callable(x, funclist[0]):
|
||||
choicelist = []
|
||||
for func in funclist:
|
||||
choicelist.append(func(x, *args, **kw))
|
||||
condlist = _stack_arrays(condlist)
|
||||
choicelist = _stack_arrays(choicelist)
|
||||
|
||||
default = 0
|
||||
n1 = len(condlist)
|
||||
n2 = len(funclist)
|
||||
if n1 + 1 == n2:
|
||||
default = choicelist[-1]
|
||||
choicelist = choicelist[:-1]
|
||||
elif n1 != n2:
|
||||
_raise_value_error('the number of choices should be either equal to conditions or ', n1 + 1)
|
||||
return select(condlist, choicelist, default=default)
|
||||
|
||||
|
||||
def unravel_index(indices, shape, order='C'):
|
||||
"""
|
||||
Converts a flat index or array of flat indices into a tuple of coordinate arrays.
|
||||
|
||||
Note:
|
||||
Out-of-bound indices are clipped by the boundaries of `shape` instead of raising
|
||||
an error.
|
||||
|
||||
Args:
|
||||
indices (Union[int, float, bool, list, tuple, Tensor]): An integer array whose elements
|
||||
are indices into the flattened version of an array of dimensions shape.
|
||||
shape (tuple of ints): The shape of the array to use for unraveling indices.
|
||||
order (Union['C', 'F'], optional): Determines whether the indices should be viewed as
|
||||
indexing in row-major (C-style) or column-major (Fortran-style) order.
|
||||
|
||||
Returns:
|
||||
Tensor, each array in the tuple has the same shape as the indices array.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Raises:
|
||||
ValueError: if `order` is not 'C' or 'F'.
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> print(np.unravel_index([22, 41, 37], (7,6)))
|
||||
(Tensor(shape=[3], dtype=Int32, value= [3, 6, 6]),
|
||||
Tensor(shape=[3], dtype=Int32, value= [4, 5, 1]))
|
||||
>>> print(np.unravel_index([31, 41, 13], (7,6), order='F'))
|
||||
(Tensor(shape=[3], dtype=Int32, value= [3, 6, 6]),
|
||||
Tensor(shape=[3], dtype=Int32, value= [4, 5, 1]))
|
||||
"""
|
||||
indices = _to_tensor(indices)
|
||||
if order not in ('C', 'F'):
|
||||
_raise_value_error('invalid order. Expected "C" or "F"')
|
||||
if isinstance(shape, int):
|
||||
shape = (shape,)
|
||||
ndim = F.rank(indices)
|
||||
if order == 'F':
|
||||
sizes = _cumprod(shape)
|
||||
else:
|
||||
sizes = _cumprod(shape[::-1])
|
||||
sizes = _to_tensor(sizes[::-1] + (1,))
|
||||
sizes = F.reshape(sizes, (-1,) + _list_comprehensions(ndim, 1, True))
|
||||
total_size = sizes[0]
|
||||
indices = where(indices > total_size - 1, total_size - 1, indices)
|
||||
if _get_device() == 'GPU':
|
||||
dtype = F.dtype(total_size)
|
||||
lowerbounds = (-(total_size.astype(mstype.float32))).astype(dtype)
|
||||
else:
|
||||
lowerbounds = -total_size
|
||||
indices = where(indices < lowerbounds, lowerbounds, indices)
|
||||
res = _mod(indices, sizes[:-1])//sizes[1:]
|
||||
|
||||
num = len(res)
|
||||
if ndim == 0 and num == 1:
|
||||
return res.ravel()
|
||||
if order == 'F':
|
||||
r = range(num - 1, -1, -1)
|
||||
else:
|
||||
r = range(num)
|
||||
subs = ()
|
||||
for i in r:
|
||||
subs += (res[i],)
|
||||
return subs
|
||||
|
||||
|
||||
def apply_over_axes(func, a, axes):
|
||||
"""
|
||||
Applies a function repeatedly over multiple axes.
|
||||
|
||||
`func` is called as `res = func(a, axis)`, where `axis` is the first element of `axes`.
|
||||
The result `res` of the function call must have either the same dimensions as `a` or
|
||||
one less dimension. If `res` has one less dimension than `a`, a dimension is inserted before `axis`.
|
||||
The call to `func` is then repeated for each axis in `axes`, with `res` as the first argument.
|
||||
|
||||
Args:
|
||||
func (function): This function must take two arguments, `func(a, axis)`.
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input tensor.
|
||||
axes (Union[int, list, tuple]): Axes over which `func` is applied; the elements must be integers.
|
||||
|
||||
Returns:
|
||||
Tensor. The number of dimensions is the same as `a`, but the shape can be different.
|
||||
This depends on whether `func` changes the shape of its output with respect to its input.
|
||||
|
||||
Raises:
|
||||
TypeError: If input `a` is not array_like or `axes` is not int or sequence of ints.
|
||||
ValueError: If any axis is out of range or duplicate axes exist.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> x = np.arange(10).reshape(2, 5).astype('float32')
|
||||
>>> print(x)
|
||||
[[0. 1. 2. 3. 4.]
|
||||
[5. 6. 7. 8. 9.]]
|
||||
>>> print(np.apply_over_axes(np.sum, x, axes=0))
|
||||
[[ 5. 7. 9. 11. 13.]]
|
||||
"""
|
||||
a = _to_tensor(a)
|
||||
if isinstance(axes, int):
|
||||
axes = (axes,)
|
||||
res = a
|
||||
for axis in axes:
|
||||
res = func(res, axis=axis)
|
||||
res = F.expand_dims(res, axis) if res.ndim != a.ndim else res
|
||||
if res.ndim != a.ndim:
|
||||
_raise_value_error("function is not returning a tensor of the correct shape")
|
||||
return res
|
||||
|
|
|
@ -16,15 +16,14 @@
|
|||
|
||||
|
||||
from ..ops import functional as F
|
||||
from ..ops.primitive import constexpr
|
||||
from ..common import dtype as mstype
|
||||
from ..common import Tensor
|
||||
from .._c_expression import typing
|
||||
|
||||
from .math_ops import _apply_tensor_op, absolute
|
||||
from .array_creations import zeros, ones, empty
|
||||
from .array_creations import zeros, ones, empty, asarray
|
||||
from .utils import _check_input_tensor, _to_tensor, _isnan
|
||||
from .utils_const import _raise_type_error, _is_shape_empty, _infer_out_shape
|
||||
from .utils_const import _raise_type_error, _is_shape_empty, _infer_out_shape, _check_same_type, \
|
||||
_check_axis_type, _canonicalize_axis, _can_broadcast, _isscalar
|
||||
|
||||
|
||||
def not_equal(x1, x2, dtype=None):
|
||||
|
@ -410,13 +409,6 @@ def isneginf(x):
|
|||
return _is_sign_inf(x, F.tensor_lt)
|
||||
|
||||
|
||||
@constexpr
|
||||
def _isscalar(x):
|
||||
"""Returns True if x is a scalar type"""
|
||||
return isinstance(x, (typing.Number, typing.Int, typing.UInt, typing.Float,
|
||||
typing.Bool, typing.String))
|
||||
|
||||
|
||||
def isscalar(element):
|
||||
"""
|
||||
Returns True if the type of element is a scalar type.
|
||||
|
@ -534,8 +526,9 @@ def in1d(ar1, ar2, invert=False):
|
|||
not rely on the uniqueness of the input arrays.
|
||||
|
||||
Args:
|
||||
ar1 (array_like): Input array with shape `(M,)`.
|
||||
ar2 (array_like): The values against which to test each value of `ar1`.
|
||||
ar1 (Union[int, float, bool, list, tuple, Tensor]): Input array with shape `(M,)`.
|
||||
ar2 (Union[int, float, bool, list, tuple, Tensor]): The values against which
|
||||
to test each value of `ar1`.
|
||||
invert (boolean, optional): If True, the values in the returned array are
|
||||
inverted (that is, False where an element of `ar1` is in `ar2` and True
|
||||
otherwise). Default is False.
|
||||
|
@ -746,3 +739,167 @@ def logical_xor(x1, x2, dtype=None):
|
|||
y1 = F.logical_or(x1, x2)
|
||||
y2 = F.logical_or(F.logical_not(x1), F.logical_not(x2))
|
||||
return _apply_tensor_op(F.logical_and, y1, y2, dtype=dtype)
|
||||
|
||||
|
||||
def array_equal(a1, a2, equal_nan=False):
|
||||
"""
|
||||
Returns `True` if input arrays have same shapes and all elements equal.
|
||||
|
||||
Note:
|
||||
In mindpsore, a bool tensor is returned instead, since in Graph mode, the
|
||||
value cannot be traced and computed at compile time.
|
||||
|
||||
Args:
|
||||
a1/a2 (Union[int, float, bool, list, tuple, Tensor]): Input arrays.
|
||||
equal_nan (bool): Whether to compare NaN’s as equal.
|
||||
|
||||
Returns:
|
||||
Scalar bool tensor, value is `True` if inputs are equal, `False` otherwise.
|
||||
|
||||
Raises:
|
||||
TypeError: If inputs have types not specified above.
|
||||
|
||||
Supported Platforms:
|
||||
``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> a = [0,1,2]
|
||||
>>> b = [[0,1,2], [0,1,2]]
|
||||
>>> print(np.array_equal(a,b))
|
||||
False
|
||||
"""
|
||||
a1 = asarray(a1)
|
||||
a2 = asarray(a2)
|
||||
if not isinstance(equal_nan, bool):
|
||||
_raise_type_error("equal_nan must be bool.")
|
||||
if a1.shape == a2.shape:
|
||||
res = equal(a1, a2)
|
||||
if equal_nan:
|
||||
res = logical_or(res, logical_and(isnan(a1), isnan(a2)))
|
||||
return res.all()
|
||||
return _to_tensor(False)
|
||||
|
||||
|
||||
def array_equiv(a1, a2):
|
||||
"""
|
||||
Returns `True` if input arrays are shape consistent and all elements equal.
|
||||
|
||||
Shape consistent means they are either the same shape, or one input array can
|
||||
be broadcasted to create the same shape as the other one.
|
||||
|
||||
Note:
|
||||
In mindpsore, a bool tensor is returned instead, since in Graph mode, the
|
||||
value cannot be traced and computed at compile time.
|
||||
|
||||
Args:
|
||||
a1/a2 (Union[int, float, bool, list, tuple, Tensor]): Input arrays.
|
||||
|
||||
Returns:
|
||||
Scalar bool tensor, value is `True` if inputs are equivalent, `False` otherwise.
|
||||
|
||||
Raises:
|
||||
TypeError: If inputs have types not specified above.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> a = [0,1,2]
|
||||
>>> b = [[0,1,2], [0,1,2]]
|
||||
>>> print(np.array_equiv(a,b))
|
||||
True
|
||||
"""
|
||||
a1 = asarray(a1)
|
||||
a2 = asarray(a2)
|
||||
if _can_broadcast(a1.shape, a2.shape):
|
||||
return equal(a1, a2).all()
|
||||
return _to_tensor(False)
|
||||
|
||||
|
||||
def signbit(x, dtype=None):
|
||||
"""
|
||||
Returns element-wise True where signbit is set (less than zero).
|
||||
|
||||
Note:
|
||||
Numpy arguments `out`, `where`, `casting`, `order`, `subok`, `signature`, and
|
||||
`extobj` are not supported.
|
||||
|
||||
Args:
|
||||
x (Union[int, float, bool, list, tuple, Tensor]): The input value(s).
|
||||
dtype (:class:`mindspore.dtype`, optional): defaults to None. Overrides the dtype of the
|
||||
output Tensor.
|
||||
|
||||
Returns:
|
||||
Tensor.
|
||||
|
||||
Raises:
|
||||
TypeError: If input is not array_like or `dtype` is not `None` or `bool`.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> x = np.array([1, -2.3, 2.1]).astype('float32')
|
||||
>>> output = np.signbit(x)
|
||||
>>> print(output)
|
||||
[False True False]
|
||||
"""
|
||||
if dtype is not None and not _check_same_type(dtype, mstype.bool_):
|
||||
_raise_type_error("Casting was not allowed for signbit.")
|
||||
x = _to_tensor(x)
|
||||
res = F.less(x, 0)
|
||||
if dtype is not None and not _check_same_type(F.dtype(res), dtype):
|
||||
res = F.cast(res, dtype)
|
||||
return res
|
||||
|
||||
|
||||
def sometrue(a, axis=None, keepdims=False):
|
||||
"""
|
||||
Tests whether any array element along a given axis evaluates to True.
|
||||
|
||||
Returns single boolean unless axis is not None
|
||||
|
||||
Args:
|
||||
a (Union[int, float, bool, list, tuple, Tensor]): Input tensor or object that can be converted to an array.
|
||||
axis (Union[None, int, tuple(int)]): Axis or axes along which a logical OR reduction is
|
||||
performed. Default: None.
|
||||
If None, perform a logical OR over all the dimensions of the input array.
|
||||
If negative, it counts from the last to the first axis.
|
||||
If tuple of ints, a reduction is performed on multiple axes, instead of a single axis or
|
||||
all the axes as before.
|
||||
keepdims (bool): Default: False.
|
||||
If True, the axes which are reduced are left in the result as dimensions with size one.
|
||||
With this option, the result will broadcast correctly against the input array.
|
||||
If the default value is passed, then keepdims will not be passed through to the any method of
|
||||
sub-classes of ndarray, however any non-default value will be. If the sub-class’ method does not
|
||||
implement keepdims any exceptions will be raised.
|
||||
|
||||
Returns:
|
||||
Returns single boolean unless axis is not None
|
||||
|
||||
Raises:
|
||||
TypeError: If input is not array_like or `axis` is not int or tuple of ints or
|
||||
`keepdims` is not integer or `initial` is not scalar.
|
||||
ValueError: If any axis is out of range or duplicate axes exist.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
|
||||
Examples:
|
||||
>>> import mindspore.numpy as np
|
||||
>>> x = np.array([1, -2.3, 2.1]).astype('float32')
|
||||
>>> output = np.signbit(x)
|
||||
>>> print(output)
|
||||
[False True False]
|
||||
"""
|
||||
if not isinstance(keepdims, int):
|
||||
_raise_type_error("integer argument expected, but got ", keepdims)
|
||||
if axis is not None:
|
||||
_check_axis_type(axis, True, True, False)
|
||||
axis = _canonicalize_axis(axis, a.ndim)
|
||||
a = _to_tensor(a)
|
||||
keepdims = keepdims not in (0, False)
|
||||
return F.not_equal(a, 0).any(axis, keepdims)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -13,11 +13,14 @@
|
|||
# limitations under the License.
|
||||
# ============================================================================
|
||||
"""internal utility functions"""
|
||||
import types
|
||||
|
||||
from ..common import Tensor
|
||||
from ..ops import functional as F
|
||||
from ..common import dtype as mstype
|
||||
|
||||
from .utils_const import _tile_size, _add_unit_axes, _raise_type_error, _type_convert
|
||||
from .utils_const import _tile_size, _add_unit_axes, _raise_type_error, _type_convert, \
|
||||
_tuple_setitem, _callable_const
|
||||
|
||||
|
||||
def _deep_list(array_like):
|
||||
|
@ -154,3 +157,52 @@ def _get_dtype_from_scalar(*input_numbers):
|
|||
def _isnan(x):
|
||||
"""Computes isnan."""
|
||||
return F.not_equal(x, x)
|
||||
|
||||
|
||||
def _convert_bool_to_int(tensor):
|
||||
"""Convert tensor with bool type to int32."""
|
||||
if tensor.dtype == mstype.bool_:
|
||||
return tensor.astype("int32")
|
||||
return tensor
|
||||
|
||||
|
||||
def _slice_along_axis(f, axis, slice_start, slice_end):
|
||||
"""
|
||||
Slice a tensor along a given axis
|
||||
|
||||
Args:
|
||||
f (Tensor): Input Tensor.
|
||||
axis (int): Specified axis.
|
||||
slice_start (int): The start of the slice.
|
||||
slice_end (int): The end of the slice.
|
||||
|
||||
Returns:
|
||||
Sliced tensor.
|
||||
"""
|
||||
index_start = (0,) * f.ndim
|
||||
index_end = f.shape
|
||||
slice_size = slice_end - slice_start
|
||||
index_start = _tuple_setitem(index_start, axis, slice_start)
|
||||
index_end = _tuple_setitem(index_end, axis, slice_size)
|
||||
return F.tensor_slice(f, index_start, index_end)
|
||||
|
||||
|
||||
def _to_tensor_origin_dtype(*args):
|
||||
"""Returns each input as Tensor and remains original dtype."""
|
||||
res = []
|
||||
for arg in args:
|
||||
if isinstance(arg, (int, float, bool, list, tuple)):
|
||||
arg = _type_convert(Tensor, arg)
|
||||
elif not isinstance(arg, Tensor):
|
||||
_raise_type_error("Expect input to be array like.")
|
||||
res.append(arg)
|
||||
if len(res) == 1:
|
||||
return res[0]
|
||||
return res
|
||||
|
||||
|
||||
def _callable(tensor, obj):
|
||||
"""Returns True if `obj` is a function."""
|
||||
if F.isconstant(tensor):
|
||||
return isinstance(obj, types.FunctionType)
|
||||
return _callable_const(F.typeof(obj))
|
||||
|
|
|
@ -14,8 +14,9 @@
|
|||
# ============================================================================
|
||||
"""internal graph-compatible utility functions"""
|
||||
import math
|
||||
from itertools import zip_longest
|
||||
from itertools import zip_longest, accumulate
|
||||
from collections import deque
|
||||
import operator
|
||||
|
||||
import mindspore.context as context
|
||||
from ..ops import functional as F
|
||||
|
@ -126,6 +127,18 @@ def _infer_out_shape(*shapes):
|
|||
return tuple(shape_out)
|
||||
|
||||
|
||||
@constexpr
|
||||
def _can_broadcast(*shapes):
|
||||
"""
|
||||
Returns Ture if shapes can broadcast, False if they cannot.
|
||||
"""
|
||||
try:
|
||||
_infer_out_shape(*shapes)
|
||||
except ValueError:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
@constexpr
|
||||
def _check_axis_in_range(axis, ndim):
|
||||
"""Checks axes are with the bounds of ndim"""
|
||||
|
@ -133,6 +146,7 @@ def _check_axis_in_range(axis, ndim):
|
|||
raise TypeError(f'axes should be integers, not {type(axis)}')
|
||||
if not -ndim <= axis < ndim:
|
||||
raise ValueError(f'axis {axis} is out of bounds for array of dimension {ndim}')
|
||||
return axis % ndim
|
||||
|
||||
|
||||
@constexpr
|
||||
|
@ -145,14 +159,11 @@ def _check_axis_valid(axes, ndim):
|
|||
axes = F.make_range(ndim)
|
||||
return axes
|
||||
if isinstance(axes, (tuple, list)):
|
||||
for axis in axes:
|
||||
_check_axis_in_range(axis, ndim)
|
||||
axes = tuple(map(lambda x: x % ndim, axes))
|
||||
axes = tuple(map(lambda x: _check_axis_in_range(x, ndim), axes))
|
||||
if any(axes.count(el) > 1 for el in axes):
|
||||
raise ValueError('duplicate value in "axis"')
|
||||
return axes
|
||||
_check_axis_in_range(axes, ndim)
|
||||
return (axes % ndim,)
|
||||
return (_check_axis_in_range(axes, ndim),)
|
||||
|
||||
|
||||
@constexpr
|
||||
|
@ -397,7 +408,7 @@ def _type_convert(force, obj):
|
|||
|
||||
|
||||
@constexpr
|
||||
def _list_comprehensions(obj, item=None, return_tuple=False):
|
||||
def _list_comprehensions(obj, item=None, return_tuple=False, make_none=False):
|
||||
"""
|
||||
Generates a new list/tuple by list comprehension.
|
||||
|
||||
|
@ -416,7 +427,9 @@ def _list_comprehensions(obj, item=None, return_tuple=False):
|
|||
lst = obj
|
||||
if isinstance(obj, int):
|
||||
lst = range(obj)
|
||||
if item is None:
|
||||
if make_none:
|
||||
res = [None for _ in lst]
|
||||
elif item is None:
|
||||
res = [i for i in lst]
|
||||
else:
|
||||
res = [item for i in lst]
|
||||
|
@ -425,17 +438,6 @@ def _list_comprehensions(obj, item=None, return_tuple=False):
|
|||
return res
|
||||
|
||||
|
||||
@constexpr
|
||||
def _tuple_getitem(tup, idx, startswith=True):
|
||||
"""
|
||||
Returns a slice from tup starting with idx. If startswith is False,
|
||||
returns a lice from tup ending with idx instead.
|
||||
"""
|
||||
if startswith:
|
||||
return tup[idx:]
|
||||
return tup[:idx]
|
||||
|
||||
|
||||
@constexpr
|
||||
def _tuple_setitem(tup, idx, value):
|
||||
"""
|
||||
|
@ -471,7 +473,7 @@ def _seq_prod(seq1, seq2):
|
|||
|
||||
@constexpr
|
||||
def _make_tensor(val, dtype):
|
||||
""" Returns the tensor with value `val` and dtype `dtype`."""
|
||||
"""Returns the tensor with value `val` and dtype `dtype`."""
|
||||
return Tensor(val, dtype)
|
||||
|
||||
|
||||
|
@ -479,3 +481,26 @@ def _make_tensor(val, dtype):
|
|||
def _tuple_slice(tup, start, end):
|
||||
"""get sliced tuple from start and end."""
|
||||
return tup[start:end]
|
||||
|
||||
|
||||
@constexpr
|
||||
def _isscalar(x):
|
||||
"""Returns True if x is a scalar type"""
|
||||
return isinstance(x, (typing.Number, typing.Int, typing.UInt, typing.Float,
|
||||
typing.Bool, typing.String))
|
||||
|
||||
|
||||
@constexpr
|
||||
def _cumprod(x):
|
||||
return tuple(accumulate(x, operator.mul))
|
||||
|
||||
|
||||
@constexpr
|
||||
def _in(x, y):
|
||||
return x in y
|
||||
|
||||
|
||||
@constexpr
|
||||
def _callable_const(x):
|
||||
"""Returns true if x is a function in graph mode."""
|
||||
return isinstance(x, typing.Function)
|
||||
|
|
|
@ -778,9 +778,8 @@ def get_stride_info_from_tuple(data_shape, tuple_index):
|
|||
|
||||
@constexpr
|
||||
def mstype_eq(x, y):
|
||||
if x == y:
|
||||
return True
|
||||
return False
|
||||
"""Determine whether the input `x` equals `y`."""
|
||||
return x == y
|
||||
|
||||
|
||||
@constexpr
|
||||
|
@ -841,3 +840,26 @@ def tuple_slice(tup, start, end):
|
|||
@constexpr
|
||||
def expanded_shape(shape, expand_size):
|
||||
return (1,)*expand_size + shape
|
||||
|
||||
|
||||
@constexpr
|
||||
def sequence_mul_int(seq, number):
|
||||
"""
|
||||
Make a new list with native python syntax.
|
||||
|
||||
Args:
|
||||
seq (Union[list, tuple]): Input sequence.
|
||||
y (int): Input number.
|
||||
|
||||
Returns:
|
||||
New sequence, has the same type as `seq`.
|
||||
"""
|
||||
if not isinstance(number, int):
|
||||
raise TypeError(f"can't multiply sequence by non-int of type {type(number)}")
|
||||
return seq * number
|
||||
|
||||
|
||||
@constexpr
|
||||
def check_in_sequence(x, y):
|
||||
"""Determine whether the input `x` is in the sequence `y`."""
|
||||
return x in y
|
||||
|
|
|
@ -130,3 +130,33 @@ def _tensor_in_tuple(x, y):
|
|||
bool, if x in y return true, x not in y return false.
|
||||
"""
|
||||
return compile_utils.tensor_in_sequence(x, y)
|
||||
|
||||
|
||||
@in_.register("mstype", "List")
|
||||
def _mstype_in_list(x, y):
|
||||
"""
|
||||
Determine if a mindspore type is in a list.
|
||||
|
||||
Args:
|
||||
x: mstype
|
||||
y: List
|
||||
|
||||
Returns:
|
||||
bool, if x in y return true, x not in y return false.
|
||||
"""
|
||||
return const_utils.check_in_sequence(x, y)
|
||||
|
||||
|
||||
@in_.register("mstype", "Tuple")
|
||||
def _mstype_in_tuple(x, y):
|
||||
"""
|
||||
Determine if a mindspore type is in a tuple.
|
||||
|
||||
Args:
|
||||
x: mstype
|
||||
y: Tuple
|
||||
|
||||
Returns:
|
||||
bool, if x in y return true, x not in y return false.
|
||||
"""
|
||||
return const_utils.check_in_sequence(x, y)
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
"""Implementation for internal polymorphism `mul` operations."""
|
||||
|
||||
from . import _constexpr_utils as const_utils
|
||||
from ...composite import base
|
||||
from ... import functional as F
|
||||
|
||||
|
@ -68,3 +69,47 @@ def _tensor_mul_scalar(x, y):
|
|||
Tensor, has the same dtype as x.
|
||||
"""
|
||||
return F.tensor_mul(x, y)
|
||||
|
||||
|
||||
@mul.register("List", "Number")
|
||||
def _list_mul_scalar(x, y):
|
||||
"""
|
||||
Returns x * y where x is a list and y is a number. y must be integer.
|
||||
|
||||
Outputs:
|
||||
List.
|
||||
"""
|
||||
return const_utils.sequence_mul_int(x, y)
|
||||
|
||||
|
||||
@mul.register("Tuple", "Number")
|
||||
def _tuple_mul_scalar(x, y):
|
||||
"""
|
||||
Returns x * y where x is a tuple and y is a number. y must be integer.
|
||||
|
||||
Outputs:
|
||||
Tuple.
|
||||
"""
|
||||
return const_utils.sequence_mul_int(x, y)
|
||||
|
||||
|
||||
@mul.register("Number", "List")
|
||||
def _scalar_mul_list(x, y):
|
||||
"""
|
||||
Returns x * y where x is a number and y is a list. x must be integer.
|
||||
|
||||
Outputs:
|
||||
List.
|
||||
"""
|
||||
return const_utils.sequence_mul_int(y, x)
|
||||
|
||||
|
||||
@mul.register("Number", "Tuple")
|
||||
def _scalar_mul_tuple(x, y):
|
||||
"""
|
||||
Returns x * y where x is a number and y is a tuple. x must be integer.
|
||||
|
||||
Outputs:
|
||||
Tuple.
|
||||
"""
|
||||
return const_utils.sequence_mul_int(y, x)
|
||||
|
|
|
@ -130,3 +130,33 @@ def _tensor_not_in_tuple(x, y):
|
|||
bool, if x not in y return true, x in y return false.
|
||||
"""
|
||||
return not compile_utils.tensor_in_sequence(x, y)
|
||||
|
||||
|
||||
@not_in_.register("mstype", "List")
|
||||
def _mstype_not_in_list(x, y):
|
||||
"""
|
||||
Determine if a mindspore type is not in a list.
|
||||
|
||||
Args:
|
||||
x: mstype
|
||||
y: List
|
||||
|
||||
Returns:
|
||||
bool, if x not in y return true, x in y return false.
|
||||
"""
|
||||
return not const_utils.check_in_sequence(x, y)
|
||||
|
||||
|
||||
@not_in_.register("mstype", "Tuple")
|
||||
def _mstype_not_in_tuple(x, y):
|
||||
"""
|
||||
Determine if a mindspore type is not in a tuple.
|
||||
|
||||
Args:
|
||||
x: mstype
|
||||
y: Tuple
|
||||
|
||||
Returns:
|
||||
bool, if x not in y return true, x in y return false.
|
||||
"""
|
||||
return not const_utils.check_in_sequence(x, y)
|
||||
|
|
|
@ -86,6 +86,10 @@ square = P.Square()
|
|||
sqrt = P.Sqrt()
|
||||
log = P.Log()
|
||||
reduce_sum = P.ReduceSum()
|
||||
reduce_max = P.ReduceMax()
|
||||
reduce_min = P.ReduceMin()
|
||||
reduce_mean = P.ReduceMean()
|
||||
reduce_prod = P.ReduceProd()
|
||||
tensor_slice = P.Slice()
|
||||
maximum = P.Maximum()
|
||||
minimum = P.Minimum()
|
||||
|
@ -106,6 +110,10 @@ asinh = P.Asinh()
|
|||
acosh = P.Acosh()
|
||||
atanh = P.Atanh()
|
||||
atan2 = P.Atan2()
|
||||
bitwise_and = P.BitwiseAnd()
|
||||
bitwise_or = P.BitwiseOr()
|
||||
bitwise_xor = P.BitwiseXor()
|
||||
invert = P.Invert()
|
||||
|
||||
scalar_to_array = P.ScalarToArray()
|
||||
scalar_to_tensor = P.ScalarToTensor()
|
||||
|
@ -227,6 +235,8 @@ tensor_operator_registry.register('mean', P.ReduceMean)
|
|||
tensor_operator_registry.register('reshape', P.Reshape)
|
||||
tensor_operator_registry.register('transpose', P.Transpose)
|
||||
tensor_operator_registry.register('broadcast_to', P.BroadcastTo)
|
||||
tensor_operator_registry.register('matmul', P.MatMul)
|
||||
tensor_operator_registry.register('argmax', P.Argmax)
|
||||
# ms cannot support Tensor(True) compare
|
||||
tensor_operator_registry.register('__eq__', equal)
|
||||
tensor_operator_registry.register('__ne__', not_equal)
|
||||
|
|
|
@ -2654,7 +2654,7 @@ class Acosh(PrimitiveWithInfer):
|
|||
TypeError: If `input_x` is not a Tensor.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
``Ascend`` ``GPU``
|
||||
|
||||
Examples:
|
||||
>>> acosh = ops.Acosh()
|
||||
|
@ -2731,7 +2731,7 @@ class Asinh(PrimitiveWithInfer):
|
|||
TypeError: If `input_x` is not a Tensor.
|
||||
|
||||
Supported Platforms:
|
||||
``Ascend`` ``GPU`` ``CPU``
|
||||
``Ascend`` ``GPU``
|
||||
|
||||
Examples:
|
||||
>>> asinh = ops.Asinh()
|
||||
|
|
|
@ -805,6 +805,127 @@ def test_vander():
|
|||
match_all_arrays(mnp_vander, onp_vander, error=1e-4)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_bartlett():
|
||||
for i in [-3, -1, 0, 1, 5, 6, 10, 15]:
|
||||
match_all_arrays(mnp.bartlett(i), onp.bartlett(i), error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_blackman():
|
||||
for i in [-3, -1, 0, 1, 5, 6, 10, 15]:
|
||||
match_all_arrays(mnp.blackman(i), onp.blackman(i), error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_hamming():
|
||||
for i in [-3, -1, 0, 1, 5, 6, 10, 15]:
|
||||
match_all_arrays(mnp.hamming(i), onp.hamming(i), error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_hanning():
|
||||
for i in [-3, -1, 0, 1, 5, 6, 10, 15]:
|
||||
match_all_arrays(mnp.hanning(i), onp.hanning(i), error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_triu_indices():
|
||||
m = rand_int().tolist()
|
||||
n = rand_int().tolist()
|
||||
k = rand_int().tolist()
|
||||
mnp_res = mnp.triu_indices(n, k, m)
|
||||
onp_res = onp.triu_indices(n, k, m)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_tril_indices():
|
||||
m = rand_int().tolist()
|
||||
n = rand_int().tolist()
|
||||
k = rand_int().tolist()
|
||||
mnp_res = mnp.tril_indices(n, k, m)
|
||||
onp_res = onp.tril_indices(n, k, m)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_triu_indices_from():
|
||||
m = int(rand_int().tolist())
|
||||
n = int(rand_int().tolist())
|
||||
t = mnp.asarray(rand_int(m, n).tolist())
|
||||
k = rand_int().tolist()
|
||||
mnp_res = mnp.triu_indices_from(t, k)
|
||||
onp_res = onp.triu_indices_from(t.asnumpy(), k)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_tril_indices_from():
|
||||
m = int(rand_int().tolist())
|
||||
n = int(rand_int().tolist())
|
||||
t = mnp.asarray(rand_int(m, n).tolist())
|
||||
k = rand_int().tolist()
|
||||
mnp_res = mnp.tril_indices_from(t, k)
|
||||
onp_res = onp.tril_indices_from(t.asnumpy(), k)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_histogram_bin_edges():
|
||||
x = onp.random.randint(-10, 10, 10)
|
||||
for bins in [(1, 2, 3), [2], 1, 5, 10]:
|
||||
# pylint: disable=redefined-builtin
|
||||
for range in [None, (3, 3), (2, 20)]:
|
||||
match_res(mnp.histogram_bin_edges, onp.histogram_bin_edges, x, bins=bins, range=range, error=3)
|
||||
match_res(mnp.histogram_bin_edges, onp.histogram_bin_edges, x, onp.arange(5))
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
|
@ -836,3 +957,90 @@ def test_linspace_exception():
|
|||
def test_empty_like_exception():
|
||||
with pytest.raises(ValueError):
|
||||
mnp.empty_like([[1, 2, 3], [4, 5]])
|
||||
|
||||
|
||||
@pytest.mark.level0
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_pad():
|
||||
x_np = onp.random.random([2, 3, 4]).astype("float32")
|
||||
x_ms = mnp.asarray(x_np.tolist())
|
||||
|
||||
# pad constant
|
||||
mnp_res = mnp.pad(x_ms, ((1, 1), (2, 2), (3, 4)))
|
||||
onp_res = onp.pad(x_np, ((1, 1), (2, 2), (3, 4)))
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
mnp_res = mnp.pad(x_ms, ((1, 1), (2, 3), (4, 5)), constant_values=((3, 4), (5, 6), (7, 8)))
|
||||
onp_res = onp.pad(x_np, ((1, 1), (2, 3), (4, 5)), constant_values=((3, 4), (5, 6), (7, 8)))
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad statistic
|
||||
mnp_res = mnp.pad(x_ms, ((1, 1), (2, 2), (3, 4)), mode="mean", stat_length=((1, 2), (2, 10), (3, 4)))
|
||||
onp_res = onp.pad(x_np, ((1, 1), (2, 2), (3, 4)), mode="mean", stat_length=((1, 2), (2, 10), (3, 4)))
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad edge
|
||||
mnp_res = mnp.pad(x_ms, ((1, 1), (2, 2), (3, 4)), mode="edge")
|
||||
onp_res = onp.pad(x_np, ((1, 1), (2, 2), (3, 4)), mode="edge")
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad wrap
|
||||
mnp_res = mnp.pad(x_ms, ((1, 1), (2, 2), (3, 4)), mode="wrap")
|
||||
onp_res = onp.pad(x_np, ((1, 1), (2, 2), (3, 4)), mode="wrap")
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad linear_ramp
|
||||
mnp_res = mnp.pad(x_ms, ((1, 3), (5, 2), (3, 0)), mode="linear_ramp", end_values=((0, 10), (9, 1), (-10, 99)))
|
||||
onp_res = onp.pad(x_np, ((1, 3), (5, 2), (3, 0)), mode="linear_ramp", end_values=((0, 10), (9, 1), (-10, 99)))
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
|
||||
def pad_with_msfunc(vector, pad_width, iaxis, kwargs):
|
||||
pad_value = kwargs.get('padder', 10)
|
||||
vector[:pad_width[0]] = pad_value
|
||||
vector[-pad_width[1]:] = pad_value
|
||||
return vector
|
||||
|
||||
|
||||
def pad_with_npfunc(vector, pad_width, iaxis, kwargs):
|
||||
pad_value = kwargs.get('padder', 10)
|
||||
vector[:pad_width[0]] = pad_value
|
||||
vector[-pad_width[1]:] = pad_value
|
||||
|
||||
|
||||
@pytest.mark.level0
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_pad_gpu():
|
||||
x_np = onp.random.random([2, 1, 4, 3]).astype("float32")
|
||||
x_ms = mnp.asarray(x_np.tolist())
|
||||
|
||||
# pad symmetric odd
|
||||
mnp_res = mnp.pad(x_ms, ((10, 3), (5, 2), (3, 0), (2, 6)), mode='symmetric', reflect_type='odd')
|
||||
onp_res = onp.pad(x_np, ((10, 3), (5, 2), (3, 0), (2, 6)), mode='symmetric', reflect_type='odd')
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad symmetric even
|
||||
mnp_res = mnp.pad(x_ms, ((10, 13), (5, 12), (3, 0), (2, 6)), mode='symmetric', reflect_type='even')
|
||||
onp_res = onp.pad(x_np, ((10, 13), (5, 12), (3, 0), (2, 6)), mode='symmetric', reflect_type='even')
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad reflect odd
|
||||
mnp_res = mnp.pad(x_ms, ((10, 3), (5, 2), (3, 0), (2, 6)), mode='reflect', reflect_type='odd')
|
||||
onp_res = onp.pad(x_np, ((10, 3), (5, 2), (3, 0), (2, 6)), mode='reflect', reflect_type='odd')
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad reflect even
|
||||
mnp_res = mnp.pad(x_ms, ((10, 13)), mode='reflect', reflect_type='even')
|
||||
onp_res = onp.pad(x_np, ((10, 13)), mode='reflect', reflect_type='even')
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
# pad func
|
||||
x_np = onp.random.random([2, 4]).astype("float32")
|
||||
x_ms = mnp.asarray(x_np.tolist())
|
||||
mnp_res = mnp.pad(x_ms, ((5, 5)), mode=pad_with_msfunc, padder=99)
|
||||
onp_res = onp.pad(x_np, ((5, 5)), mode=pad_with_npfunc, padder=99)
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
|
|
@ -23,7 +23,7 @@ import mindspore.numpy as mnp
|
|||
from mindspore.nn import Cell
|
||||
|
||||
from .utils import rand_int, run_non_kw_test, check_all_results, match_array, \
|
||||
rand_bool, match_res, run_multi_test, to_tensor
|
||||
rand_bool, match_res, run_multi_test, to_tensor, match_all_arrays
|
||||
|
||||
|
||||
class Cases():
|
||||
|
@ -1253,6 +1253,22 @@ def test_select():
|
|||
match_res(mnp.select, onp.select, condlist, choicelist, default=10)
|
||||
|
||||
|
||||
def test_choose():
|
||||
x = rand_int(2, 1, 4).astype(onp.int32)
|
||||
y = rand_int(3, 2, 5, 4).astype(onp.int32)
|
||||
match_res(mnp.choose, onp.choose, x, y, mode='wrap')
|
||||
match_res(mnp.choose, onp.choose, x, y, mode='clip')
|
||||
|
||||
x = rand_int(5, 3, 1, 7).astype(onp.int32)
|
||||
y1 = rand_int(7).astype(onp.int32)
|
||||
y2 = rand_int(1, 3, 1).astype(onp.int32)
|
||||
y3 = rand_int(5, 1, 1, 7).astype(onp.int32)
|
||||
onp_arrays = (x, (y1, y2, y3))
|
||||
mnp_arrays = (to_tensor(x), tuple(map(to_tensor, (y1, y2, y3))))
|
||||
match_all_arrays(mnp.choose(*mnp_arrays, mode='wrap'), onp.choose(*onp_arrays, mode='wrap'))
|
||||
match_all_arrays(mnp.choose(*mnp_arrays, mode='clip'), onp.choose(*onp_arrays, mode='clip'))
|
||||
|
||||
|
||||
class ReshapeExpandSqueeze(Cell):
|
||||
def __init__(self):
|
||||
super(ReshapeExpandSqueeze, self).__init__()
|
||||
|
@ -1444,3 +1460,159 @@ def test_rot90():
|
|||
o_rot = onp_rot90(onp_array)
|
||||
m_rot = mnp_rot90(mnp_array)
|
||||
check_all_results(o_rot, m_rot)
|
||||
|
||||
|
||||
def mnp_size(x):
|
||||
a = mnp.size(x)
|
||||
b = mnp.size(x, axis=0)
|
||||
return a, b
|
||||
|
||||
|
||||
def onp_size(x):
|
||||
a = onp.size(x)
|
||||
b = onp.size(x, axis=0)
|
||||
return a, b
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_size():
|
||||
onp_arr = onp.random.rand(2, 3, 4).astype('float32')
|
||||
mnp_arr = to_tensor(onp_arr)
|
||||
for actual, expected in zip(mnp_size(mnp_arr), onp_size(onp_arr)):
|
||||
match_array(actual, expected)
|
||||
|
||||
|
||||
def mnp_array_str(x):
|
||||
return mnp.array_str(x)
|
||||
|
||||
|
||||
def onp_array_str(x):
|
||||
return onp.array_str(x)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_array_str():
|
||||
onp_arr = onp.random.rand(2, 3, 4).astype('float32')
|
||||
mnp_arr = to_tensor(onp_arr)
|
||||
for actual, expected in zip(mnp_size(mnp_arr), onp_size(onp_arr)):
|
||||
match_array(actual, expected)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_apply_along_axis():
|
||||
onp_arr = rand_int(5, 3, 7)
|
||||
mnp_arr = to_tensor(onp_arr)
|
||||
for i in range(-3, 3):
|
||||
mnp_res = mnp.apply_along_axis(mnp.diag, i, mnp_arr)
|
||||
onp_res = onp.apply_along_axis(onp.diag, i, onp_arr)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
mnp_res = mnp.apply_along_axis(lambda x: x[0], 2, mnp_arr)
|
||||
onp_res = onp.apply_along_axis(lambda x: x[0], 2, onp_arr)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
mnp_res = mnp.apply_along_axis(lambda x, y, offset=0: (x[4] - y)*offset, 2, mnp_arr, 1, offset=3)
|
||||
onp_res = onp.apply_along_axis(lambda x, y, offset=0: (x[4] - y)*offset, 2, onp_arr, 1, offset=3)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_piecewise():
|
||||
x = rand_int(2, 4)
|
||||
mnp_x = to_tensor(x)
|
||||
condlist = [x < 2, x == 2, x > 2]
|
||||
mnp_condlist = [mnp_x < 2, mnp_x == 2, mnp_x > 2]
|
||||
funclist = [lambda x, offset=0: x - offset, lambda x, offset=0: x, lambda x, offset=0: x*offset]
|
||||
mnp_res = mnp.piecewise(mnp_x, mnp_condlist, funclist, offset=2)
|
||||
onp_res = onp.piecewise(x, condlist, funclist, offset=2)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
funclist = [-1, 0, 1]
|
||||
mnp_res = mnp.piecewise(mnp_x, mnp_condlist, funclist)
|
||||
onp_res = onp.piecewise(x, condlist, funclist)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
condlist = [x > 10, x < 0]
|
||||
mnp_x = to_tensor(x)
|
||||
mnp_condlist = [mnp_x > 10, mnp_x < 0]
|
||||
funclist = [lambda x: x - 2, lambda x: x - 1, lambda x: x*2]
|
||||
mnp_res = mnp.piecewise(mnp_x, mnp_condlist, funclist)
|
||||
onp_res = onp.piecewise(x, condlist, funclist)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
x = 2
|
||||
condlist = True
|
||||
funclist = [lambda x: x - 1]
|
||||
mnp_res = mnp.piecewise(x, condlist, funclist)
|
||||
onp_res = onp.piecewise(x, condlist, funclist)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_unravel_index():
|
||||
shapes = [(), 1, 3, (5, 1), (2, 6, 3)]
|
||||
dims = [(5, 4, 7), (5*4, 7), 5*4*7]
|
||||
for shape in shapes:
|
||||
x = onp.random.randint(0, 5*4*7, shape)
|
||||
for dim in dims:
|
||||
for order in ('C', 'F'):
|
||||
mnp_res = mnp.unravel_index(to_tensor(x), dim, order=order)
|
||||
onp_res = onp.unravel_index(x, dim, order=order)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
||||
|
||||
def mnp_apply_over_axes(x):
|
||||
a = mnp.apply_over_axes(mnp.sum, x, axes=0)
|
||||
b = mnp.apply_over_axes(mnp.sum, x, axes=(0, 1))
|
||||
c = mnp.apply_over_axes(mnp.std, x, axes=1)
|
||||
d = mnp.apply_over_axes(mnp.mean, x, axes=(-1,))
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
def onp_apply_over_axes(x):
|
||||
a = onp.apply_over_axes(onp.sum, x, axes=0)
|
||||
b = onp.apply_over_axes(onp.sum, x, axes=(0, 1))
|
||||
c = onp.apply_over_axes(onp.std, x, axes=1)
|
||||
d = onp.apply_over_axes(onp.mean, x, axes=(-1,))
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_apply_over_axes():
|
||||
arrs = [
|
||||
onp.random.rand(2, 2).astype('float32'),
|
||||
onp.random.rand(3, 2, 2).astype('float32'),
|
||||
onp.random.rand(5, 4, 3, 3).astype('float32'),
|
||||
]
|
||||
for x in arrs:
|
||||
for expected, actual in zip(onp_apply_over_axes(x),
|
||||
mnp_apply_over_axes(to_tensor(x))):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
|
|
@ -398,3 +398,91 @@ def test_logical_not():
|
|||
expected = onp_logical_not(arr)
|
||||
actual = mnp_logical_not(to_tensor(arr))
|
||||
onp.testing.assert_equal(actual.asnumpy().tolist(), expected.tolist())
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_array_equal():
|
||||
a = [0, 1, 2, float('inf'), float('nan')]
|
||||
b = [0, 1, 2, float('inf'), float('nan')]
|
||||
match_all_arrays(mnp.array_equal(a, b), onp.array_equal(a, b))
|
||||
a = [0, 1, 2]
|
||||
b = [[0, 1, 2], [0, 1, 2]]
|
||||
assert mnp.array_equal(a, b) == onp.array_equal(a, b)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_array_equiv():
|
||||
a = [0, 1, 2, float('inf'), float('nan')]
|
||||
b = [0, 1, 2, float('inf'), float('nan')]
|
||||
match_all_arrays(mnp.array_equal(a, b), onp.array_equal(a, b))
|
||||
a = [0, 1, 2]
|
||||
b = [[0, 1, 2], [0, 1, 2]]
|
||||
assert mnp.array_equal(a, b) == onp.array_equal(a, b)
|
||||
|
||||
|
||||
def mnp_signbit(*arrs):
|
||||
arr1 = arrs[0]
|
||||
arr2 = arrs[1]
|
||||
a = mnp.signbit(arr1)
|
||||
b = mnp.signbit(arr2, dtype=mnp.bool_)
|
||||
return a, b
|
||||
|
||||
|
||||
def onp_signbit(*arrs):
|
||||
arr1 = arrs[0]
|
||||
arr2 = arrs[1]
|
||||
a = onp.signbit(arr1)
|
||||
b = onp.signbit(arr2, dtype='bool')
|
||||
return a, b
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_signbit():
|
||||
onp_arrs = [onp.arange(-10, 10).astype('float32'), onp.arange(-10, 10).astype('int32')]
|
||||
mnp_arrs = [mnp.arange(-10, 10).astype('float32'), mnp.arange(-10, 10).astype('int32')]
|
||||
for actual, expected in zip(mnp_signbit(*mnp_arrs), onp_signbit(*onp_arrs)):
|
||||
onp.testing.assert_equal(actual.asnumpy().tolist(), expected.tolist())
|
||||
|
||||
|
||||
def mnp_sometrue(x):
|
||||
a = mnp.sometrue(x)
|
||||
b = mnp.sometrue(x, axis=0)
|
||||
c = mnp.sometrue(x, axis=(0, -1))
|
||||
d = mnp.sometrue(x, axis=(0, 1), keepdims=True)
|
||||
e = mnp.sometrue(x, axis=(0, 1), keepdims=-1)
|
||||
f = mnp.sometrue(x, axis=(0, 1), keepdims=0)
|
||||
return a, b, c, d, e, f
|
||||
|
||||
|
||||
def onp_sometrue(x):
|
||||
a = onp.sometrue(x)
|
||||
b = onp.sometrue(x, axis=0)
|
||||
c = onp.sometrue(x, axis=(0, -1))
|
||||
d = onp.sometrue(x, axis=(0, 1), keepdims=True)
|
||||
e = onp.sometrue(x, axis=(0, 1), keepdims=-1)
|
||||
f = onp.sometrue(x, axis=(0, 1), keepdims=0)
|
||||
return a, b, c, d, e, f
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_sometrue():
|
||||
onp_arr = onp.full((3, 2), [True, False])
|
||||
mnp_arr = to_tensor(onp_arr)
|
||||
for actual, expected in zip(mnp_sometrue(mnp_arr), onp_sometrue(onp_arr)):
|
||||
onp.testing.assert_equal(actual.asnumpy().tolist(), expected.tolist())
|
||||
|
|
|
@ -18,6 +18,7 @@ import pytest
|
|||
import numpy as onp
|
||||
|
||||
import mindspore.numpy as mnp
|
||||
from mindspore.common.dtype import dtype_to_nptype
|
||||
|
||||
from .utils import rand_int, rand_bool, run_binop_test, run_unary_test, run_multi_test, \
|
||||
run_single_test, match_res, match_array, match_meta, match_all_arrays, to_tensor
|
||||
|
@ -600,14 +601,14 @@ def test_outer():
|
|||
@pytest.mark.env_onecard
|
||||
def test_type_promotion():
|
||||
arr = rand_int(2, 3)
|
||||
onp_sum = onp_add(arr, arr)
|
||||
onp_res = onp_add(arr, arr)
|
||||
|
||||
a = to_tensor(arr, dtype=mnp.float16)
|
||||
b = to_tensor(arr, dtype=mnp.float32)
|
||||
c = to_tensor(arr, dtype=mnp.int32)
|
||||
|
||||
match_array(mnp_add(a, b).asnumpy(), onp_sum)
|
||||
match_array(mnp_add(b, c).asnumpy(), onp_sum)
|
||||
match_array(mnp_add(a, b).asnumpy(), onp_res)
|
||||
match_array(mnp_add(b, c).asnumpy(), onp_res)
|
||||
|
||||
|
||||
def mnp_absolute(x):
|
||||
|
@ -1817,6 +1818,93 @@ def test_lcm():
|
|||
match_res(mnp_lcm, onp_lcm, x, y)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_exception_innner():
|
||||
with pytest.raises(ValueError):
|
||||
mnp.inner(to_tensor(test_case.arrs[0]),
|
||||
to_tensor(test_case.arrs[1]))
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_exception_add():
|
||||
with pytest.raises(ValueError):
|
||||
mnp.add(to_tensor(test_case.arrs[1]), to_tensor(test_case.arrs[2]))
|
||||
|
||||
|
||||
def mnp_nanmax(x):
|
||||
a = mnp.nanmax(x)
|
||||
b = mnp.nanmax(x, keepdims=True)
|
||||
c = mnp.nanmax(x, axis=-2)
|
||||
d = mnp.nanmax(x, axis=0, keepdims=True)
|
||||
e = mnp.nanmax(x, axis=(-2, 3))
|
||||
f = mnp.nanmax(x, axis=(-3, -1), keepdims=True)
|
||||
return a, b, c, d, e, f
|
||||
|
||||
|
||||
def onp_nanmax(x):
|
||||
a = onp.nanmax(x)
|
||||
b = onp.nanmax(x, keepdims=True)
|
||||
c = onp.nanmax(x, axis=-2)
|
||||
d = onp.nanmax(x, axis=0, keepdims=True)
|
||||
e = onp.nanmax(x, axis=(-2, 3))
|
||||
f = onp.nanmax(x, axis=(-3, -1), keepdims=True)
|
||||
return a, b, c, d, e, f
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_nanmax():
|
||||
x = rand_int(2, 3, 4, 5)
|
||||
x[0][2][1][3] = onp.nan
|
||||
x[1][0][2][4] = onp.nan
|
||||
x[1][1][1][1] = onp.nan
|
||||
run_multi_test(mnp_nanmax, onp_nanmax, (x,))
|
||||
|
||||
|
||||
def mnp_nanmin(x):
|
||||
a = mnp.nanmin(x)
|
||||
b = mnp.nanmin(x, keepdims=True)
|
||||
c = mnp.nanmin(x, axis=-2)
|
||||
d = mnp.nanmin(x, axis=0, keepdims=True)
|
||||
e = mnp.nanmin(x, axis=(-2, 3))
|
||||
f = mnp.nanmin(x, axis=(-3, -1), keepdims=True)
|
||||
return a, b, c, d, e, f
|
||||
|
||||
|
||||
def onp_nanmin(x):
|
||||
a = onp.nanmin(x)
|
||||
b = onp.nanmin(x, keepdims=True)
|
||||
c = onp.nanmin(x, axis=-2)
|
||||
d = onp.nanmin(x, axis=0, keepdims=True)
|
||||
e = onp.nanmin(x, axis=(-2, 3))
|
||||
f = onp.nanmin(x, axis=(-3, -1), keepdims=True)
|
||||
return a, b, c, d, e, f
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_nanmin():
|
||||
x = rand_int(2, 3, 4, 5)
|
||||
x[0][2][1][3] = onp.nan
|
||||
x[1][0][2][4] = onp.nan
|
||||
x[1][1][1][1] = onp.nan
|
||||
run_multi_test(mnp_nanmin, onp_nanmin, (x,))
|
||||
|
||||
|
||||
def mnp_nansum(x):
|
||||
a = mnp.nansum(x)
|
||||
b = mnp.nansum(x, keepdims=True)
|
||||
|
@ -1927,10 +2015,17 @@ def test_mean():
|
|||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_exception_innner():
|
||||
with pytest.raises(ValueError):
|
||||
mnp.inner(to_tensor(test_case.arrs[0]),
|
||||
to_tensor(test_case.arrs[1]))
|
||||
def test_corrcoef():
|
||||
x = onp.random.random((3, 4)).tolist()
|
||||
mnp_res = mnp.corrcoef(x)
|
||||
onp_res = onp.corrcoef(x)
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
mnp_res = mnp.corrcoef(x[0])
|
||||
onp_res = onp.corrcoef(x[0])
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
mnp_res = mnp.corrcoef(x, rowvar=False)
|
||||
onp_res = onp.corrcoef(x, rowvar=False)
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
|
@ -1939,9 +2034,227 @@ def test_exception_innner():
|
|||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_exception_add():
|
||||
with pytest.raises(ValueError):
|
||||
mnp.add(to_tensor(test_case.arrs[1]), to_tensor(test_case.arrs[2]))
|
||||
def test_multi_dot():
|
||||
arrays = [rand_int(3), rand_int(3, 5), rand_int(5, 2), rand_int(2, 7), rand_int(7)]
|
||||
mnp_arrays = [to_tensor(arr) for arr in arrays]
|
||||
match_all_arrays(mnp.multi_dot(mnp_arrays), onp.linalg.multi_dot(arrays))
|
||||
match_all_arrays(mnp.multi_dot(mnp_arrays[1:]), onp.linalg.multi_dot(arrays[1:]))
|
||||
match_all_arrays(mnp.multi_dot(mnp_arrays[:-1]), onp.linalg.multi_dot(arrays[:-1]))
|
||||
match_all_arrays(mnp.multi_dot(mnp_arrays[1:-1]), onp.linalg.multi_dot(arrays[1:-1]))
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_gradient():
|
||||
f = onp.random.random((3, 4, 5)).tolist()
|
||||
mnp_res = mnp.gradient(f)
|
||||
onp_res = onp.gradient(f)
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
mnp_res = mnp.gradient(f, axis=1)
|
||||
onp_res = onp.gradient(f, axis=1)
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
mnp_res = mnp.gradient(f, -3, axis=(-1, 1))
|
||||
onp_res = onp.gradient(f, -3, axis=(-1, 1))
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
mnp_res = mnp.gradient(f, -3, 5, axis=(-1, 0))
|
||||
onp_res = onp.gradient(f, -3, 5, axis=(-1, 0))
|
||||
match_all_arrays(mnp_res, onp_res, error=1e-5)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_argmax():
|
||||
match_res(mnp.argmax, onp.argmax, rand_int())
|
||||
match_res(mnp.argmax, onp.argmax, rand_int(3))
|
||||
match_res(mnp.argmax, onp.argmax, rand_int(1, 1, 1))
|
||||
x = onp.random.choice(onp.arange(-100, 100), size=(2, 3, 4, 5), replace=False)
|
||||
match_res(mnp.argmax, onp.argmax, x)
|
||||
for i in range(-4, 4):
|
||||
match_res(mnp.argmax, onp.argmax, x, axis=i)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_argmin():
|
||||
match_res(mnp.argmin, onp.argmin, rand_int())
|
||||
match_res(mnp.argmin, onp.argmin, rand_int(3))
|
||||
match_res(mnp.argmin, onp.argmin, rand_int(1, 1, 1))
|
||||
x = rand_int(2, 3, 4, 5)
|
||||
match_res(mnp.argmin, onp.argmin, x)
|
||||
for i in range(-4, 4):
|
||||
match_res(mnp.argmin, onp.argmin, x, axis=i)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_searchsorted():
|
||||
x = onp.arange(-10, 10)
|
||||
y = onp.random.randint(-15, 15, size=(2, 3, 4)) + onp.random.choice([0, 0.5], (2, 3, 4))
|
||||
sorter = onp.random.shuffle(onp.arange(20))
|
||||
match_res(mnp.searchsorted, onp.searchsorted, x, y)
|
||||
match_res(mnp.searchsorted, onp.searchsorted, x, y, side='right')
|
||||
match_res(mnp.searchsorted, onp.searchsorted, x, y, sorter=sorter)
|
||||
match_res(mnp.searchsorted, onp.searchsorted, x, y, side='right', sorter=sorter)
|
||||
|
||||
|
||||
@pytest.mark.level2
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_interp():
|
||||
x = onp.random.randint(-15, 15, size=(2, 3, 4)) + onp.random.choice([0, 0.5], (2, 3, 4))
|
||||
xp = onp.arange(-10, 10)
|
||||
fp = onp.random.uniform(-50, 50, 20)
|
||||
match_res(mnp.interp, onp.interp, x, xp, fp, error=3)
|
||||
match_res(mnp.interp, onp.interp, x, xp, fp, left=onp.random.rand(), error=3)
|
||||
match_res(mnp.interp, onp.interp, x, xp, fp, right=onp.random.rand(), error=3)
|
||||
match_res(mnp.interp, onp.interp, x, xp, fp, left=onp.random.rand(), right=onp.random.rand(), error=3)
|
||||
|
||||
|
||||
@pytest.mark.level2
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_digitize():
|
||||
bins = onp.random.randint(-10, 10, size=10)
|
||||
bins.sort()
|
||||
x = onp.random.randint(-15, 15, size=(2, 3, 4)) + onp.random.choice([0, 0.5], (2, 3, 4))
|
||||
match_res(mnp.digitize, onp.digitize, x, [])
|
||||
match_res(mnp.digitize, onp.digitize, [], [])
|
||||
match_res(mnp.digitize, onp.digitize, [], bins)
|
||||
match_res(mnp.digitize, onp.digitize, x, bins)
|
||||
match_res(mnp.digitize, onp.digitize, x, bins, right=True)
|
||||
bins = onp.flip(bins)
|
||||
match_res(mnp.digitize, onp.digitize, x, bins)
|
||||
match_res(mnp.digitize, onp.digitize, x, bins, right=True)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_bincount():
|
||||
x = onp.random.randint(0, 10, 20)
|
||||
weights = onp.random.randn(20)
|
||||
match_res(mnp.bincount, onp.bincount, x)
|
||||
match_res(mnp.bincount, onp.bincount, x, minlength=25)
|
||||
match_res(mnp.bincount, onp.bincount, x, weights, error=3)
|
||||
match_res(mnp.bincount, onp.bincount, x, weights, minlength=25, error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_histogram():
|
||||
x = onp.random.randint(-10, 10, 10)
|
||||
weights = onp.random.randn(10)
|
||||
for bins in [(1, 2, 3), [2], 1, 5, 10]:
|
||||
# pylint: disable=redefined-builtin
|
||||
for range in [None, (3, 3), (2, 20)]:
|
||||
match_res(mnp.histogram, onp.histogram, x, bins=bins, range=range, error=3)
|
||||
match_res(mnp.histogram, onp.histogram, x, bins=bins, range=range, density=True, error=3)
|
||||
mnp_res = mnp.histogram(to_tensor(x), bins=bins, range=range, weights=to_tensor(weights))
|
||||
onp_res = onp.histogram(x, bins=bins, range=range, weights=weights)
|
||||
match_all_arrays(mnp_res, onp_res, error=3)
|
||||
mnp_res = mnp.histogram(to_tensor(x), bins=bins, range=range,
|
||||
weights=to_tensor(weights), density=True)
|
||||
onp_res = onp.histogram(x, bins=bins, range=range, weights=weights, density=True)
|
||||
match_all_arrays(mnp_res, onp_res, error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_histogramdd():
|
||||
x = onp.random.randint(-10, 10, (5, 3))
|
||||
y = [onp.random.randint(-10, 10, 5), onp.random.randint(-10, 10, 5), onp.random.randint(-10, 10, 5)]
|
||||
mnp_y = list(map(to_tensor, y))
|
||||
weights = onp.random.randn(5)
|
||||
for bins in [(15, 4, 9), 10, [onp.arange(5).tolist(), onp.arange(3, 6).tolist(),
|
||||
onp.arange(10, 20).tolist()]]:
|
||||
# pylint: disable=redefined-builtin
|
||||
for range in [None, [[0, 5], [2, 7], [1, 3]]]:
|
||||
mnp_res = mnp.histogramdd(to_tensor(x), bins=bins, range=range)
|
||||
onp_res = onp.histogramdd(x, bins=bins, range=range)
|
||||
match_all_arrays(mnp_res[0], onp_res[0], error=3)
|
||||
match_all_arrays(mnp_res[1], onp_res[1], error=3)
|
||||
mnp_res = mnp.histogramdd(to_tensor(x), bins=bins, range=range, density=True)
|
||||
onp_res = onp.histogramdd(x, bins=bins, range=range, density=True)
|
||||
match_all_arrays(mnp_res[0], onp_res[0], error=3)
|
||||
match_all_arrays(mnp_res[1], onp_res[1], error=3)
|
||||
mnp_res = mnp.histogramdd(to_tensor(x), bins=bins, range=range, weights=to_tensor(weights))
|
||||
onp_res = onp.histogramdd(x, bins=bins, range=range, weights=weights)
|
||||
match_all_arrays(mnp_res[0], onp_res[0], error=3)
|
||||
match_all_arrays(mnp_res[1], onp_res[1], error=3)
|
||||
mnp_res = mnp.histogramdd(to_tensor(x), bins=bins, range=range,
|
||||
weights=to_tensor(weights), density=True)
|
||||
|
||||
mnp_res = mnp.histogramdd(mnp_y, bins=bins, range=range, weights=to_tensor(weights),
|
||||
density=True)
|
||||
onp_res = onp.histogramdd(y, bins, range=range, weights=weights, density=True)
|
||||
match_all_arrays(mnp_res[0], onp_res[0], error=3)
|
||||
match_all_arrays(mnp_res[1], onp_res[1], error=3)
|
||||
|
||||
bins = onp.arange(24).reshape(3, 8)
|
||||
mnp_res = mnp.histogramdd(to_tensor(x), bins=to_tensor(bins))
|
||||
onp_res = onp.histogramdd(x, bins=bins)
|
||||
match_all_arrays(mnp_res[0], onp_res[0], error=3)
|
||||
match_all_arrays(mnp_res[1], onp_res[1], error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_histogram2d():
|
||||
x = onp.random.randint(-10, 10, 10)
|
||||
y = onp.random.randint(-10, 10, 10)
|
||||
|
||||
weights = onp.random.randn(10)
|
||||
for bins in [(5, 7), 4, [onp.arange(5).tolist(), onp.arange(2, 10).tolist()], [8, [1, 2, 3]]]:
|
||||
# pylint: disable=redefined-builtin
|
||||
for range in [None, [(3, 3), (2, 20)]]:
|
||||
match_res(mnp.histogram2d, onp.histogram2d, x, y, bins=bins, range=range, error=3)
|
||||
match_res(mnp.histogram2d, onp.histogram2d, x, y, bins=bins, range=range, density=True,
|
||||
error=3)
|
||||
mnp_res = mnp.histogram2d(to_tensor(x), to_tensor(y), bins=bins, range=range,
|
||||
weights=to_tensor(weights))
|
||||
onp_res = onp.histogram2d(x, y, bins=bins, range=range, weights=weights)
|
||||
match_all_arrays(mnp_res, onp_res, error=3)
|
||||
mnp_res = mnp.histogram2d(to_tensor(x), to_tensor(y), bins=bins, range=range,
|
||||
weights=to_tensor(weights), density=True)
|
||||
onp_res = onp.histogram2d(x, y, bins=bins, range=range, weights=weights, density=True)
|
||||
match_all_arrays(mnp_res, onp_res, error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
|
@ -1955,6 +2268,277 @@ def test_exception_mean():
|
|||
mnp.mean(to_tensor(test_case.arrs[0]), (-1, 0))
|
||||
|
||||
|
||||
def mnp_sum(x):
|
||||
a = mnp.sum(x)
|
||||
b = mnp.sum(x, axis=0)
|
||||
c = mnp.sum(x, axis=(0, 1))
|
||||
d = mnp.sum(x, keepdims=True)
|
||||
e = mnp.sum(x, initial=-1)
|
||||
f = mnp.sum(x, initial=1)
|
||||
g = mnp.sum(x, axis=(0, 2, -2), keepdims=True, initial=0.5, dtype=mnp.float64)
|
||||
return a, b, c, d, e, f, g
|
||||
|
||||
|
||||
def onp_sum(x):
|
||||
a = onp.sum(x)
|
||||
b = onp.sum(x, axis=0)
|
||||
c = onp.sum(x, axis=(0, 1))
|
||||
d = onp.sum(x, keepdims=True)
|
||||
e = onp.sum(x, initial=-1)
|
||||
f = onp.sum(x, initial=1)
|
||||
g = onp.sum(x, axis=(0, 2, -2), keepdims=True, initial=0.5, dtype=onp.float64)
|
||||
return a, b, c, d, e, f, g
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_sum():
|
||||
onp_arr = onp.random.rand(2, 3, 4).astype('float32')
|
||||
mnp_arr = to_tensor(onp_arr)
|
||||
for actual, expected in zip(mnp_sum(mnp_arr), onp_sum(onp_arr)):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
def mnp_sign(x):
|
||||
return mnp.sign(x)
|
||||
|
||||
|
||||
def onp_sign(x):
|
||||
return onp.sign(x)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_sign():
|
||||
onp_arr = [
|
||||
onp.array(3.5).astype('float32'),
|
||||
onp.arange(-5, 5).astype('float32'),
|
||||
onp.random.rand(2, 3, 4).astype('float32')
|
||||
]
|
||||
mnp_arr = list(map(to_tensor, onp_arr))
|
||||
for onp_x, mnp_x in zip(onp_arr, mnp_arr):
|
||||
expected = onp_sign(onp_x)
|
||||
actual = mnp_sign(mnp_x)
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
def mnp_copysign(x, y):
|
||||
return mnp.copysign(x, y)
|
||||
|
||||
|
||||
def onp_copysign(x, y):
|
||||
return onp.copysign(x, y)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_copysign():
|
||||
onp_arr = [[onp.array([1, -1, 2, -3]).astype('float32'),
|
||||
onp.array([1, -1, -1, 1]).astype('float32')],
|
||||
[onp.random.rand(2, 3, 4).astype('float32'),
|
||||
onp.random.rand(2, 3, 4).astype('float32')]]
|
||||
mnp_arr = list(map(to_tensor, onp_arr))
|
||||
for onp_x, mnp_x in zip(onp_arr, mnp_arr):
|
||||
expected = onp_copysign(onp_x[0], onp_x[1])
|
||||
actual = mnp_copysign(mnp_x[0], mnp_x[1])
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
def mnp_matrix_power(x):
|
||||
a = mnp.matrix_power(x, 0)
|
||||
b = mnp.matrix_power(x, 1)
|
||||
c = mnp.matrix_power(x, 2)
|
||||
d = mnp.matrix_power(x, 3)
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
def onp_matrix_power(x):
|
||||
a = onp.linalg.matrix_power(x, 0)
|
||||
b = onp.linalg.matrix_power(x, 1)
|
||||
c = onp.linalg.matrix_power(x, 2)
|
||||
d = onp.linalg.matrix_power(x, 3)
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_matrix_power():
|
||||
arrs = [
|
||||
onp.random.rand(2, 2).astype('float32'),
|
||||
onp.random.rand(3, 2, 2).astype('float32'),
|
||||
onp.random.rand(5, 4, 3, 3).astype('float32'),
|
||||
]
|
||||
for x in arrs:
|
||||
onp_res = onp_matrix_power(x)
|
||||
mnp_res = mnp_matrix_power(to_tensor(x))
|
||||
for expected, actual in zip(onp_res, mnp_res):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
def mnp_around(x):
|
||||
a = mnp.around(x)
|
||||
b = mnp.around(x, 1)
|
||||
c = mnp.around(x, 2)
|
||||
d = mnp.around(x, 3)
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
def onp_around(x):
|
||||
a = onp.around(x)
|
||||
b = onp.around(x, 1)
|
||||
c = onp.around(x, 2)
|
||||
d = onp.around(x, 3)
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_around():
|
||||
arrs = [
|
||||
onp.random.rand(2, 2).astype('float32'),
|
||||
onp.random.rand(3, 2, 2).astype('float32'),
|
||||
onp.random.rand(5, 4, 3, 3).astype('float32'),
|
||||
]
|
||||
for x in arrs:
|
||||
onp_res = onp_around(x)
|
||||
mnp_res = mnp_around(to_tensor(x))
|
||||
for expected, actual in zip(onp_res, mnp_res):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_polyadd():
|
||||
arrs = [rand_int(), rand_int(1), rand_int(3), rand_int(7)]
|
||||
for x in arrs:
|
||||
for y in arrs:
|
||||
match_res(mnp.polyadd, onp.polyadd, x, y)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_polysub():
|
||||
arrs = [rand_int(), rand_int(1), rand_int(3), rand_int(7)]
|
||||
for x in arrs:
|
||||
for y in arrs:
|
||||
match_res(mnp.polysub, onp.polysub, x, y, error=1)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_polyval():
|
||||
polys = [rand_int(1), rand_int(3), rand_int(7)]
|
||||
arrs = [rand_int(), rand_int(1), rand_int(3), rand_int(2, 3, 1), rand_int(1, 5, 4)]
|
||||
for p in polys:
|
||||
for x in arrs:
|
||||
match_res(mnp.polyval, onp.polyval, p, x, error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_polyder():
|
||||
poly = rand_int(7)
|
||||
for i in range(5):
|
||||
match_res(mnp.polyder, onp.polyder, poly, m=i)
|
||||
|
||||
|
||||
@pytest.mark.level2
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_polymul():
|
||||
arrs = [rand_int(), rand_int(1), rand_int(3), rand_int(7)]
|
||||
for x in arrs:
|
||||
for y in arrs:
|
||||
match_res(mnp.polymul, onp.polymul, x, y)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_polyint():
|
||||
poly = rand_int(7)
|
||||
match_res(mnp.polyint, onp.polyint, poly, m=1, k=7, error=3)
|
||||
match_res(mnp.polyint, onp.polyint, poly, m=1, k=[9], error=3)
|
||||
match_res(mnp.polyint, onp.polyint, poly, m=3, k=2, error=3)
|
||||
|
||||
for i in range(5):
|
||||
match_res(mnp.polyint, onp.polyint, poly, m=i, k=rand_int(i).tolist(), error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_result_type():
|
||||
x = ('?', True, mnp.uint16, mnp.ones((2, 3)).astype(mnp.int32), 'float')
|
||||
y = ('?', True, onp.uint16, onp.ones((2, 3)).astype(onp.int32), 'float')
|
||||
for i in range(4):
|
||||
mnp_args = x[:i + 1]
|
||||
actual = dtype_to_nptype(mnp.result_type(*mnp_args))
|
||||
onp_args = y[:i + 1]
|
||||
expected = onp.result_type(*onp_args)
|
||||
if expected == onp.int64:
|
||||
expected = onp.int
|
||||
elif expected == onp.float64:
|
||||
expected = onp.float32
|
||||
assert actual == expected
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_unwrap():
|
||||
x = onp.linspace(onp.linspace((0, 1), (10, 15), 5), onp.linspace((0, 2), (3*onp.pi, 7*onp.pi), 5), 7)
|
||||
x[5:2] += onp.pi
|
||||
for i in range(-3, 3):
|
||||
match_res(mnp.unwrap, onp.unwrap, x, axis=i, error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
|
@ -1964,3 +2548,185 @@ def test_exception_mean():
|
|||
def test_exception_amax():
|
||||
with pytest.raises(TypeError):
|
||||
mnp.amax(mnp.array([[1, 2], [3, 4]]).astype(mnp.float32), initial=[1.0, 2.0])
|
||||
|
||||
|
||||
def mnp_cumprod(x):
|
||||
a = mnp.cumprod(x)
|
||||
b = mnp.cumprod(x, axis=0)
|
||||
c = mnp.cumprod(x, axis=1)
|
||||
return a, b, c
|
||||
|
||||
|
||||
def onp_cumprod(x):
|
||||
a = onp.cumprod(x)
|
||||
b = onp.cumprod(x, axis=0)
|
||||
c = onp.cumprod(x, axis=1)
|
||||
return a, b, c
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_cumprod():
|
||||
mnp_x = mnp.arange(1, 7).reshape(2, 3)
|
||||
tensors = [mnp_x.astype('bool'),
|
||||
mnp_x.astype('uint8'),
|
||||
mnp_x.astype('int16'),
|
||||
mnp_x.astype('float16'),
|
||||
mnp_x.astype('float32')]
|
||||
for x in tensors:
|
||||
onp_res = onp_cumprod(x.asnumpy())
|
||||
mnp_res = mnp_cumprod(x)
|
||||
for expected, actual in zip(onp_res, mnp_res):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
def mnp_ravel_multi_index(x):
|
||||
a = mnp.ravel_multi_index(x, (7, 6))
|
||||
b = mnp.ravel_multi_index(x, (7, 6), order='F')
|
||||
c = mnp.ravel_multi_index(x, (4, 6), mode='clip')
|
||||
d = mnp.ravel_multi_index(x, (4, 4), mode='wrap')
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
def onp_ravel_multi_index(x):
|
||||
a = onp.ravel_multi_index(x, (7, 6))
|
||||
b = onp.ravel_multi_index(x, (7, 6), order='F')
|
||||
c = onp.ravel_multi_index(x, (4, 6), mode='clip')
|
||||
d = onp.ravel_multi_index(x, (4, 4), mode='wrap')
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_ravel_multi_index():
|
||||
x = mnp.array([[3, 6, 6], [4, 5, 1]])
|
||||
onp_res = onp_ravel_multi_index(x.asnumpy())
|
||||
mnp_res = mnp_ravel_multi_index(x)
|
||||
for expected, actual in zip(onp_res, mnp_res):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
def test_norm():
|
||||
arrs = [rand_int(1), rand_int(9), rand_int(6, 4), rand_int(5, 2, 3, 7)]
|
||||
for x in arrs:
|
||||
for keepdims in [True, False]:
|
||||
match_res(mnp.norm, onp.linalg.norm, x, keepdims=keepdims, error=3)
|
||||
|
||||
axes = [None, -1, 1, 2]
|
||||
order = [None, float('inf'), -float('inf'), 0, 1, -1, 2, -2, 3.7, -5, 3]
|
||||
for x, axis in zip(arrs, axes):
|
||||
# pylint: disable=redefined-builtin
|
||||
for ord in order:
|
||||
for keepdims in [True, False]:
|
||||
match_res(mnp.norm, onp.linalg.norm, x, ord=ord, axis=axis, keepdims=keepdims, error=3)
|
||||
|
||||
x = rand_int(3, 6, 4, 5)
|
||||
axes = [(0, 1), (0, 3), (1, 3), (2, 3)]
|
||||
order = [None, 'fro', float('inf'), -float('inf'), 1, -1]
|
||||
for axis in axes:
|
||||
# pylint: disable=redefined-builtin
|
||||
for ord in order:
|
||||
for keepdims in [True, False]:
|
||||
match_res(mnp.norm, onp.linalg.norm, x, ord=ord, axis=axis, keepdims=keepdims, error=3)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_bitwise_and():
|
||||
arrs = [onp.random.randint(-100, 100, ()), onp.random.randint(-100, 100, (1,)),
|
||||
onp.random.randint(-100, 100, (5,)), onp.random.randint(-100, 100, (3, 1)),
|
||||
onp.random.randint(-100, 100, (4, 1, 5))]
|
||||
for x in arrs:
|
||||
for y in arrs:
|
||||
match_res(mnp.bitwise_and, onp.bitwise_and, x, y, dtype=mnp.int32)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_bitwise_or():
|
||||
arrs = [onp.random.randint(-100, 100, ()), onp.random.randint(-100, 100, (1,)),
|
||||
onp.random.randint(-100, 100, (5,)), onp.random.randint(-100, 100, (3, 1)),
|
||||
onp.random.randint(-100, 100, (4, 1, 5))]
|
||||
for x in arrs:
|
||||
for y in arrs:
|
||||
match_res(mnp.bitwise_or, onp.bitwise_or, x, y, dtype=mnp.int32)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_bitwise_xor():
|
||||
arrs = [onp.random.randint(-100, 100, ()), onp.random.randint(-100, 100, (1,)),
|
||||
onp.random.randint(-100, 100, (5,)), onp.random.randint(-100, 100, (3, 1)),
|
||||
onp.random.randint(-100, 100, (4, 1, 5))]
|
||||
for x in arrs:
|
||||
for y in arrs:
|
||||
match_res(mnp.bitwise_xor, onp.bitwise_xor, x, y, dtype=mnp.int32)
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_arm_ascend_training
|
||||
@pytest.mark.platform_x86_ascend_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_invert():
|
||||
x = onp.random.randint(-100, 100, (2, 3))
|
||||
match_res(mnp.invert, onp.invert, x, dtype=mnp.int16)
|
||||
match_res(mnp.invert, onp.invert, x.astype(onp.uint16), dtype=mnp.uint16)
|
||||
|
||||
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.platform_x86_cpu
|
||||
@pytest.mark.env_onecard
|
||||
@pytest.mark.env_onecard
|
||||
def test_rint():
|
||||
arrs = [
|
||||
onp.random.rand(2, 2).astype('float32'),
|
||||
onp.random.rand(3, 2, 2).astype('float32'),
|
||||
onp.random.rand(5, 4, 3, 3).astype('float32'),
|
||||
]
|
||||
for x in arrs:
|
||||
for expected, actual in zip(onp.rint(x), mnp.rint(to_tensor(x))):
|
||||
match_array(actual.asnumpy(), expected, error=5)
|
||||
|
||||
|
||||
def mnp_correlate(a, v):
|
||||
a = mnp.correlate(a, v, mode="valid")
|
||||
b = mnp.correlate(a, v, mode="full")
|
||||
c = mnp.correlate(a, v, mode="same")
|
||||
d = mnp.correlate(a, v)
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
def onp_correlate(a, v):
|
||||
a = onp.correlate(a, v, mode="valid")
|
||||
b = onp.correlate(a, v, mode="full")
|
||||
c = onp.correlate(a, v, mode="same")
|
||||
d = onp.correlate(a, v)
|
||||
return a, b, c, d
|
||||
|
||||
|
||||
@pytest.mark.level1
|
||||
@pytest.mark.platform_x86_gpu_training
|
||||
@pytest.mark.env_onecard
|
||||
def test_correlate():
|
||||
first_sequences = [[1], [1, 2], [0, 0, 0, 1], [1, 2, 3, 4, 5]]
|
||||
second_sequences = [[2], [0, 1], [1, 2, 3]]
|
||||
for a in first_sequences:
|
||||
for v in second_sequences:
|
||||
mnp_res = mnp_correlate(a, v)
|
||||
onp_res = onp_correlate(a, v)
|
||||
match_all_arrays(mnp_res, onp_res)
|
||||
|
|
|
@ -24,7 +24,7 @@ def match_array(actual, expected, error=0):
|
|||
if isinstance(actual, int):
|
||||
actual = onp.asarray(actual)
|
||||
|
||||
if isinstance(expected, int):
|
||||
if isinstance(expected, (int, tuple)):
|
||||
expected = onp.asarray(expected)
|
||||
|
||||
if error > 0:
|
||||
|
@ -91,11 +91,9 @@ def rand_bool(*shape):
|
|||
|
||||
def match_res(mnp_fn, onp_fn, *arrs, **kwargs):
|
||||
"""Checks results from applying mnp_fn and onp_fn on arrs respectively"""
|
||||
dtype = kwargs.get('dtype', mnp.float32)
|
||||
kwargs.pop('dtype', None)
|
||||
dtype = kwargs.pop('dtype', mnp.float32)
|
||||
mnp_arrs = map(functools.partial(Tensor, dtype=dtype), arrs)
|
||||
error = kwargs.get('error', 0)
|
||||
kwargs.pop('error', None)
|
||||
error = kwargs.pop('error', 0)
|
||||
mnp_res = mnp_fn(*mnp_arrs, **kwargs)
|
||||
onp_res = onp_fn(*arrs, **kwargs)
|
||||
match_all_arrays(mnp_res, onp_res, error=error)
|
||||
|
@ -173,6 +171,7 @@ def run_logical_test(mnp_fn, onp_fn, test_case):
|
|||
for x2 in test_case.boolean_arrs:
|
||||
match_res(mnp_fn, onp_fn, x1, x2, dtype=mnp.bool_)
|
||||
|
||||
|
||||
def to_tensor(obj, dtype=None):
|
||||
if dtype is None:
|
||||
res = Tensor(obj)
|
||||
|
|
Loading…
Reference in New Issue