add some numpy method

This commit is contained in:
liuyang_655 2022-03-08 22:59:17 -05:00
parent e2eef76c99
commit 139ee01205
4 changed files with 388 additions and 6 deletions

View File

@ -34,7 +34,7 @@ from .array_ops import (transpose, expand_dims, squeeze, rollaxis, swapaxes, res
rot90, select, array_split, choose, size, array_str, apply_along_axis, rot90, select, array_split, choose, size, array_str, apply_along_axis,
piecewise, unravel_index, apply_over_axes) piecewise, unravel_index, apply_over_axes)
from .array_creations import copy_ as copy from .array_creations import copy_ as copy
from .array_creations import (array, asarray, asfarray, ones, zeros, full, arange, from .array_creations import (array, asarray, asfarray, ones, zeros, full, randn, rand, randint, arange,
linspace, logspace, eye, identity, empty, empty_like, linspace, logspace, eye, identity, empty, empty_like,
ones_like, zeros_like, full_like, diagonal, tril, triu, ones_like, zeros_like, full_like, diagonal, tril, triu,
tri, trace, meshgrid, mgrid, ogrid, diagflat, tri, trace, meshgrid, mgrid, ogrid, diagflat,
@ -83,10 +83,10 @@ array_ops_module = ['transpose', 'expand_dims', 'squeeze', 'rollaxis', 'swapaxes
'repeat', 'rot90', 'select', 'array_split', 'choose', 'size', 'array_str', 'repeat', 'rot90', 'select', 'array_split', 'choose', 'size', 'array_str',
'apply_along_axis', 'piecewise', 'unravel_index', 'apply_over_axes'] 'apply_along_axis', 'piecewise', 'unravel_index', 'apply_over_axes']
array_creations_module = ['array', 'asarray', 'asfarray', 'ones', 'zeros', 'full', 'arange', array_creations_module = ['array', 'asarray', 'asfarray', 'ones', 'zeros', 'full', 'randn', 'rand',
'linspace', 'logspace', 'eye', 'identity', 'empty', 'empty_like', 'randint', 'arange', 'linspace', 'logspace', 'eye', 'identity', 'empty',
'ones_like', 'zeros_like', 'full_like', 'diagonal', 'tril', 'triu', 'empty_like', 'ones_like', 'zeros_like', 'full_like', 'diagonal', 'tril',
'tri', 'trace', 'meshgrid', 'mgrid', 'ogrid', 'diagflat', 'diag', 'triu', 'tri', 'trace', 'meshgrid', 'mgrid', 'ogrid', 'diagflat', 'diag',
'diag_indices', 'ix_', 'indices', 'geomspace', 'vander', 'hamming', 'diag_indices', 'ix_', 'indices', 'geomspace', 'vander', 'hamming',
'hanning', 'bartlett', 'blackman', 'triu_indices', 'tril_indices', 'hanning', 'bartlett', 'blackman', 'triu_indices', 'tril_indices',
'triu_indices_from', 'tril_indices_from', 'histogram_bin_edges', 'pad'] 'triu_indices_from', 'tril_indices_from', 'histogram_bin_edges', 'pad']

View File

@ -21,6 +21,7 @@ import numpy as onp
from .. import context from .. import context
from ..common import Tensor from ..common import Tensor
from ..common import dtype as mstype from ..common import dtype as mstype
from ..common.seed import get_seed
from ..ops import operations as P from ..ops import operations as P
from ..ops import functional as F from ..ops import functional as F
from ..ops.primitive import constexpr from ..ops.primitive import constexpr
@ -38,7 +39,7 @@ from .utils_const import _raise_value_error, _empty, _max, _min, \
_tuple_setitem _tuple_setitem
from .array_ops import ravel, concatenate, broadcast_arrays, reshape, broadcast_to, flip, \ from .array_ops import ravel, concatenate, broadcast_arrays, reshape, broadcast_to, flip, \
apply_along_axis, where, moveaxis apply_along_axis, where, moveaxis
from .dtypes import nan, pi from .dtypes import nan, pi, dtype_map
# According to official numpy reference, the dimension of a numpy array must be less # According to official numpy reference, the dimension of a numpy array must be less
# than 32 # than 32
@ -379,6 +380,198 @@ def full(shape, fill_value, dtype=None):
return _convert_64_to_32(empty_compile(dtype, shape)) return _convert_64_to_32(empty_compile(dtype, shape))
def _generate_shapes(shape):
"""Generate shapes for randn and rand."""
if not shape:
size = (1,)
elif len(shape) == 1:
if isinstance(shape[0], int):
size = shape
elif isinstance(shape[0], list):
size = tuple(shape[0])
elif isinstance(shape[0], tuple):
size = shape[0]
else:
raise TypeError("If the length of the argument 'shape' is 1, the type of the argument 'shape' must be "
"one of ['int', 'list', 'tuple'], but got {}.".format(type(shape[0])))
else:
for index, value in enumerate(shape):
if not isinstance(value, int):
raise TypeError("If the length of the argument 'shape' is > 1, the type of the argument 'shape' must "
"all be int, but got {} at index {}.".format(type(value), index))
size = shape
return size
def _check_rand_type(dtype):
"""Check type for randn and rand"""
type_list = ['float', 'float16', 'float32', 'float64']
if isinstance(dtype, str):
if dtype not in type_list:
raise ValueError("If the argument 'dtype' is str, it must be one of {}, but got {}."
.format(type_list, dtype))
try:
dtype = dtype_map[dtype]
except KeyError:
raise KeyError("Unsupported dtype {}.".format(dtype))
elif dtype not in (mstype.float64, mstype.float32, mstype.float16):
raise ValueError("The argument 'dtype' must be 'mindspore.float64', 'mindspore.float32' or "
"'mindspore.float16', but got {}.".format(dtype))
def randn(*shape, dtype=mstype.float32):
"""
Returns a new Tensor with given shape and dtype, filled with a sample (or samples)
from the standard normal distribution.
Args:
*shape (Union[int, tuple(int), list(int)]): Shape of the new tensor, e.g.,
:math:`(2, 3)` or :math:`2`.
dtype (Union[:class:`mindspore.dtype`, str], optional): Designated tensor dtype, it must
be float type. Default is :class:`mindspore.float32`.
Returns:
Tensor, with the designated shape and dtype, filled with a sample (or samples)
from the "standard normal" distribution.
Raises:
TypeError: If input arguments have types not specified above.
ValueError: If `dtype` is not float type.
Supported Platforms:
``Ascend`` ``GPU`` ``CPU``
Examples:
>>> import mindspore.numpy as np
>>> from mindspore import set_seed
>>> set_seed(1)
>>> print(np.randn((2,3)))
[[ 0.30639967 -0.42438635 -0.20454668]
[-0.4287376 1.3054721 0.64747655]]
"""
_check_rand_type(dtype)
size = _generate_shapes(shape)
seed = get_seed()
if seed is not None:
stdnormal = P.StandardNormal(seed=seed)
else:
stdnormal = P.StandardNormal()
return stdnormal(size).astype(dtype)
def rand(*shape, dtype=mstype.float32):
"""
Returns a new Tensor with given shape and dtype, filled with random numbers from the
uniform distribution on the interval :math:`[0, 1)`.
Args:
*shape (Union[int, tuple(int), list(int)]): Shape of the new tensor, e.g.,
:math:`(2, 3)` or :math:`2`.
dtype (Union[:class:`mindspore.dtype`, str], optional): Designated tensor dtype, it must
be float type. Default is :class:`mindspore.float32`.
Returns:
Tensor, with the designated shape and dtype, filled with random numbers from the
uniform distribution on the interval :math:`[0, 1)`.
Raises:
TypeError: If input arguments have types not specified above.
ValueError: If `dtype` is not float type.
Supported Platforms:
``Ascend`` ``GPU`` ``CPU``
Examples:
>>> import mindspore.numpy as np
>>> from mindspore import set_seed
>>> set_seed(1)
>>> print(np.rand((2,3)))
[[4.1702199e-01 9.9718481e-01 7.2032452e-01]
[9.3255734e-01 1.1438108e-04 1.2812445e-01]]
"""
_check_rand_type(dtype)
size = _generate_shapes(shape)
seed = get_seed()
if seed is not None:
uniformreal = P.UniformReal(seed=seed)
else:
uniformreal = P.UniformReal()
return uniformreal(size).astype(dtype)
def randint(minval, maxval=None, shape=None, dtype=mstype.int32):
"""
Return random integers from minval (inclusive) to maxval (exclusive). Return random integers from the
discrete uniform distribution of the specified dtype in the half-open interval :math:`[minval, maxval)`.
If maxval is None (the default), then results are from [0, maxval).
Args:
minval(Union[int]): Start value of interval. The interval includes this value. When `maxval`
is :class:`None`, `minval` must be greater than 0. When `maxval` is not :class:`None`,
`minval` must be less than `maxval`.
maxval(Union[int], optional): End value of interval. The interval does not include this value.
shape (Union[int, tuple(int)]): Shape of the new tensor, e.g., :math:`(2, 3)` or :math:`2`.
dtype (Union[:class:`mindspore.dtype`, str], optional): Designated tensor dtype, it must
be int type. Default is :class:`mindspore.int32`.
Returns:
Tensor, with the designated shape and dtype, filled with random integers from minval (inclusive)
to maxval (exclusive).
Raises:
TypeError: If input arguments have types not specified above.
ValueError: If input arguments have values not specified above.
Supported Platforms:
``Ascend`` ``GPU`` ``CPU``
Examples:
>>> import mindspore.numpy as np
>>> from mindspore import set_seed
>>> set_seed(1)
>>> print(np.randint(1, 10, (2,3)))
[[4 9 7]
[9 1 2]]
"""
if not isinstance(minval, int):
raise TypeError("For mindspore.numpy.randint, the type of the argument 'minval' must be int, "
"but got {}.".format(type(minval)))
if maxval is None:
if minval <= 0:
raise ValueError("For mindspore.numpy.randint, the argument 'minval' must be > 0 when the argument "
"'maxval' is None, but got {}.".format(minval))
maxval = minval
minval = 0
else:
if not isinstance(maxval, int):
raise TypeError("For mindspore.numpy.randint, the type of the argument 'maxval' must be int, "
"but got {}.".format(type(maxval)))
if minval >= maxval:
raise ValueError("For mindspore.numpy.randint, the value of 'minval' must be greater than the value of "
"'maxval', but got 'minval': {} and 'maxval': {}.".format(minval, maxval))
if isinstance(dtype, str):
if dtype not in ('int', 'int8', 'int16', 'int32', 'int64'):
raise ValueError("For 'mindspore.numpy.randint', if the argument 'dtype' is str, it must be one of "
"['int', 'int8', 'int16', 'int32', 'int64'], but got {}.".format(dtype))
try:
dtype = dtype_map[dtype]
except KeyError:
raise KeyError("Unsupported dtype {}.".format(dtype))
elif dtype not in (mstype.int64, mstype.int32, mstype.int16, mstype.int8):
raise ValueError("For 'mindspore.numpy.randint', the argument 'dtype' must be 'mindspore.int64', "
"'mindspore.int32', 'mindspore.int16' or 'mindspore.int8', but got {}.".format(dtype))
if shape is None:
shape = (1,)
else:
shape = _check_shape(shape)
seed = get_seed()
if seed is not None:
uniformint = P.UniformInt(seed=seed)
else:
uniformint = P.UniformInt()
return uniformint(shape, Tensor(minval, mstype.int32), Tensor(maxval, mstype.int32)).astype(dtype)
def arange(start, stop=None, step=None, dtype=None): def arange(start, stop=None, step=None, dtype=None):
""" """
Returns evenly spaced values within a given interval. Returns evenly spaced values within a given interval.

View File

@ -27,6 +27,7 @@ from mindspore.nn.grad.cell_grad import _JvpInner
from mindspore.nn.grad.cell_grad import _VjpInner from mindspore.nn.grad.cell_grad import _VjpInner
from mindspore.ops import _constants from mindspore.ops import _constants
from mindspore.ops.primitive import constexpr from mindspore.ops.primitive import constexpr
import numpy as np
from .primitive import Primitive from .primitive import Primitive
from . import operations as P from . import operations as P
from .operations import _grad_ops from .operations import _grad_ops
@ -395,6 +396,71 @@ shard_fn = Shard()
def shard(fn, in_axes, out_axes, device="Ascend", level=0): def shard(fn, in_axes, out_axes, device="Ascend", level=0):
return shard_fn(fn, in_axes, out_axes, device, level) return shard_fn(fn, in_axes, out_axes, device, level)
def arange(start=0, stop=None, step=1, rtype=None):
"""
Returns evenly spaced values within a given interval.
Args:
start(Union[int, float]): Start value of interval. The interval includes this value. When
`stop` is None, `start` must be greater than 0, and the interval is :math:`[0, start)`.
When `stop` is not None, `start` must be less than `stop`.
stop(Union[int, float], optional): End value of interval. The interval does not
include this value. Default is None.
step(Union[int, float], optional): Spacing between values. For any output
`out`, this is the distance between two adjacent values, :math:`out[i+1] - out[i]`.
The default step size is 1. If `step` is specified as a position argument,
`start` must also be given.
rtype (Union[:class:`mindspore.dtype`, str], optional): Designated tensor type.
If rtype is None, the data type of the new tensor will be inferred from start,
stop and step. Default is None.
Returns:
Tensor with evenly spaced values.
Raises:
TypeError: If input arguments have types not specified above.
ValueError: If input arguments have values not specified above.
Supported Platforms:
``Ascend`` ``GPU`` ``CPU``
Examples:
>>> import mindspore.ops as ops
>>> print(ops.arange(0, 5, 1))
[0 1 2 3 4]
>>> print(ops.arange(3))
[0 1 2]
>>> print(ops.arange(start=0, stop=3))
[0 1 2]
>>> print(ops.arange(0, stop=3, step=0.5))
[0. 0.5 1. 1.5 2. 2.5]
"""
if stop is None:
start, stop = 0, start
arg_map = {"start": start, "stop": stop, "step": step}
for arg in arg_map:
try:
arg_value = arg_map[arg]
except KeyError:
raise KeyError("Unsupported key {}, the key must be one of ['start', 'stop', 'step'].".format(arg_value))
if not isinstance(arg_value, int) and not isinstance(arg_value, float):
raise TypeError("For mindspore.ops.range, the argument '{}' must be int or float, but got {}."
.format(arg, type(arg_value)))
if start >= stop:
raise ValueError("For mindspore.ops.range, the argument 'start' must be < 'stop', but got 'start': {}, "
"'stop': {}.".format(start, stop))
if rtype is None:
data = np.arange(start, stop, step)
if data.dtype == int:
rtype = mstype.int32
else:
rtype = mstype.float32
return Tensor(np.arange(start, stop, step), dtype=rtype)
def narrow(inputs, axis, start, length): def narrow(inputs, axis, start, length):
""" """
Returns a narrowed tensor from input tensor. Returns a narrowed tensor from input tensor.

View File

@ -17,7 +17,10 @@
import pytest import pytest
import numpy as onp import numpy as onp
import mindspore.numpy as mnp import mindspore.numpy as mnp
import mindspore.ops.functional as F
from mindspore import context from mindspore import context
from mindspore import set_seed
from mindspore.common import dtype as mstype
from .utils import rand_int, rand_bool, match_array, match_res, match_meta, \ from .utils import rand_int, rand_bool, match_array, match_res, match_meta, \
match_all_arrays, run_multi_test, to_tensor match_all_arrays, run_multi_test, to_tensor
@ -894,6 +897,126 @@ def test_histogram_bin_edges():
match_res(mnp.histogram_bin_edges, onp.histogram_bin_edges, x, bins=10, range=(2, 20), error=3) match_res(mnp.histogram_bin_edges, onp.histogram_bin_edges, x, bins=10, range=(2, 20), 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_randn():
"""
Feature: Numpy method randn.
Description: Test numpy method randn.
Expectation: No exception.
"""
set_seed(1)
t1 = mnp.randn(1, 2, 3)
t2 = mnp.randn(1, 2, 3)
assert (t1.asnumpy() == t2.asnumpy()).all()
with pytest.raises(ValueError):
mnp.randn(dtype="int32")
with pytest.raises(ValueError):
mnp.randn(dtype=mstype.int32)
with pytest.raises(TypeError):
mnp.randn({1})
with pytest.raises(TypeError):
mnp.randn(1, 1.2, 2)
@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_rand():
"""
Feature: Numpy method rand.
Description: Test numpy method rand.
Expectation: No exception.
"""
set_seed(1)
t1 = mnp.rand(1, 2, 3)
t2 = mnp.rand(1, 2, 3)
assert (t1.asnumpy() == t2.asnumpy()).all()
with pytest.raises(ValueError):
mnp.rand(dtype="int32")
with pytest.raises(ValueError):
mnp.rand(dtype=mstype.int32)
with pytest.raises(TypeError):
mnp.rand({1})
with pytest.raises(TypeError):
mnp.rand(1, 1.2, 2)
@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_randint():
"""
Feature: Numpy method randint.
Description: Test numpy method randint.
Expectation: No exception.
"""
set_seed(1)
t1 = mnp.randint(1, 5, 3)
t2 = mnp.randint(1, 5, 3)
assert (t1.asnumpy() == t2.asnumpy()).all()
with pytest.raises(TypeError):
mnp.randint(1.2)
with pytest.raises(ValueError):
mnp.randint(0)
with pytest.raises(TypeError):
mnp.randint(1, 1.2)
with pytest.raises(ValueError):
mnp.randint(2, 1)
with pytest.raises(ValueError):
mnp.randint(1, dtype="float")
with pytest.raises(ValueError):
mnp.randint(1, dtype=mstype.float32)
@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_ops_arange():
"""
Feature: Ops function arange.
Description: Test ops function arange.
Expectation: No exception.
"""
actual = onp.arange(5)
expected = F.arange(5).asnumpy()
match_array(actual, expected)
actual = onp.arange(0, 5)
expected = F.arange(0, 5).asnumpy()
match_array(actual, expected)
actual = onp.arange(5, step=0.2)
expected = F.arange(5, step=0.2).asnumpy()
match_array(actual, expected)
actual = onp.arange(0.1, 0.9)
expected = F.arange(0.1, 0.9).asnumpy()
match_array(actual, expected)
with pytest.raises(TypeError):
F.arange([1])
with pytest.raises(ValueError):
F.arange(10, 1)
@pytest.mark.level1 @pytest.mark.level1
@pytest.mark.platform_arm_ascend_training @pytest.mark.platform_arm_ascend_training
@pytest.mark.platform_x86_ascend_training @pytest.mark.platform_x86_ascend_training