未验证 提交 52caf787 编写于 作者: L liym27 提交者: GitHub

[Cherry-pick 2.0] Migrate 4 APIs about array to paddle.tensor.* (#29565) (#30101)

4 APIs: array_length, array_read, array_write, create_array,cherry-pick #29565
上级 7fc2ce50
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
from __future__ import print_function from __future__ import print_function
import unittest import unittest
import paddle
import paddle.fluid as fluid import paddle.fluid as fluid
import paddle.fluid.core as core import paddle.fluid.core as core
import paddle.fluid.layers as layers import paddle.fluid.layers as layers
...@@ -127,17 +129,53 @@ class TestArrayReadWrite(unittest.TestCase): ...@@ -127,17 +129,53 @@ class TestArrayReadWrite(unittest.TestCase):
class TestArrayReadWriteOpError(unittest.TestCase): class TestArrayReadWriteOpError(unittest.TestCase):
def test_errors(self): def _test_errors(self, use_fluid_api=True):
with program_guard(Program(), Program()): if use_fluid_api:
#for ci coverage with program_guard(Program(), Program()):
x1 = numpy.random.randn(2, 4).astype('int32') x1 = numpy.random.randn(2, 4).astype('int32')
x2 = fluid.layers.fill_constant(shape=[1], dtype='int32', value=1) x2 = fluid.layers.fill_constant(
x3 = numpy.random.randn(2, 4).astype('int32') shape=[1], dtype='int32', value=1)
x3 = numpy.random.randn(2, 4).astype('int32')
self.assertRaises(
TypeError, fluid.layers.array_read, array=x1, i=x2) self.assertRaises(
self.assertRaises( TypeError, fluid.layers.array_read, array=x1, i=x2)
TypeError, fluid.layers.array_write, array=x1, i=x2, out=x3) self.assertRaises(
TypeError, fluid.layers.array_write, array=x1, i=x2, out=x3)
else:
with program_guard(Program(), Program()):
x1 = numpy.random.randn(2, 4).astype('int32')
x2 = paddle.ones(shape=[1], dtype='int32')
x3 = numpy.random.randn(2, 4).astype('int32')
self.assertRaises(
TypeError, paddle.tensor.array_read, array=x1, i=x2)
self.assertRaises(
TypeError,
paddle.tensor.array_write,
array=x1,
i=x2,
out=x3)
def test_fluid_api(self):
self._test_errors(use_fluid_api=True)
def test_paddle_api(self):
self._test_errors(use_fluid_api=False)
class TestArrayReadWriteApi(unittest.TestCase):
def test_api(self):
paddle.disable_static()
arr = paddle.tensor.create_array(dtype="float32")
x = paddle.full(shape=[1, 3], fill_value=5, dtype="float32")
i = paddle.zeros(shape=[1], dtype="int32")
arr = paddle.tensor.array_write(x, i, array=arr)
item = paddle.tensor.array_read(arr, i)
self.assertTrue(numpy.allclose(x.numpy(), item.numpy()))
paddle.enable_static()
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
from __future__ import print_function from __future__ import print_function
import unittest import unittest
import paddle
import paddle.fluid.layers as layers import paddle.fluid.layers as layers
from paddle.fluid.executor import Executor from paddle.fluid.executor import Executor
import paddle.fluid.core as core import paddle.fluid.core as core
...@@ -44,5 +46,20 @@ class TestLoDArrayLengthOpError(unittest.TestCase): ...@@ -44,5 +46,20 @@ class TestLoDArrayLengthOpError(unittest.TestCase):
self.assertRaises(TypeError, fluid.layers.array_length, array=x1) self.assertRaises(TypeError, fluid.layers.array_length, array=x1)
class TestArrayLengthApi(unittest.TestCase):
def test_api(self):
paddle.disable_static()
arr = paddle.tensor.create_array(dtype='float32')
x = paddle.full(shape=[3, 3], fill_value=5, dtype="float32")
i = paddle.zeros(shape=[1], dtype="int32")
arr = paddle.tensor.array_write(x, i, array=arr)
arr_len = paddle.tensor.array_length(arr)
self.assertEqual(arr_len, 1)
paddle.enable_static()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -202,3 +202,8 @@ from .stat import median #DEFINE_ALIAS ...@@ -202,3 +202,8 @@ from .stat import median #DEFINE_ALIAS
# from .tensor import LoDTensor #DEFINE_ALIAS # from .tensor import LoDTensor #DEFINE_ALIAS
# from .tensor import LoDTensorArray #DEFINE_ALIAS # from .tensor import LoDTensorArray #DEFINE_ALIAS
from .to_string import set_printoptions #DEFINE_ALIAS from .to_string import set_printoptions #DEFINE_ALIAS
from .array import array_length #DEFINE_ALIAS
from .array import array_read #DEFINE_ALIAS
from .array import array_write #DEFINE_ALIAS
from .array import create_array #DEFINE_ALIAS
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Define functions about array.
from ..fluid import layers
def array_length(array):
"""
This OP is used to get the length of the input array.
Args:
array (list|Tensor): The input array that will be used to compute the length. In dynamic mode, ``array`` is a Python list. But in static mode, array is a Tensor whose VarType is LOD_TENSOR_ARRAY.
Returns:
Tensor: 1-D Tensor with shape [1], which is the length of array.
Examples:
.. code-block:: python
import paddle
arr = paddle.tensor.create_array(dtype='float32')
x = paddle.full(shape=[3, 3], fill_value=5, dtype="float32")
i = paddle.zeros(shape=[1], dtype="int32")
arr = paddle.tensor.array_write(x, i, array=arr)
arr_len = paddle.tensor.array_length(arr)
print(arr_len) # 1
"""
return layers.array_length(array)
def array_read(array, i):
"""
This OP is used to read data at the specified position from the input array.
Case:
.. code-block:: text
Input:
The shape of first three tensors are [1], and that of the last one is [1,2]:
array = ([0.6], [0.1], [0.3], [0.4, 0.2])
And:
i = [3]
Output:
output = [0.4, 0.2]
Args:
array (list|Tensor): The input array. In dynamic mode, ``array`` is a Python list. But in static mode, array is a Tensor whose ``VarType`` is ``LOD_TENSOR_ARRAY``.
i (Tensor): 1-D Tensor, whose shape is [1] and dtype is int64. It represents the
specified read position of ``array``.
Returns:
Tensor: A Tensor that is read at the specified position of ``array``.
Examples:
.. code-block:: python
import paddle
arr = paddle.tensor.create_array(dtype="float32")
x = paddle.full(shape=[1, 3], fill_value=5, dtype="float32")
i = paddle.zeros(shape=[1], dtype="int32")
arr = paddle.tensor.array_write(x, i, array=arr)
item = paddle.tensor.array_read(arr, i)
print(item) # [[5., 5., 5.]]
"""
return layers.array_read(array, i)
def array_write(x, i, array=None):
"""
This OP writes the input ``x`` into the i-th position of the ``array`` returns the modified array.
If ``array`` is none, a new array will be created and returned.
Args:
x (Tensor): The input data to be written into array. It's multi-dimensional
Tensor or LoDTensor. Data type: float32, float64, int32, int64 and bool.
i (Tensor): 1-D Tensor with shape [1], which represents the position into which
``x`` is written.
array (list|Tensor, optional): The array into which ``x`` is written. The default value is None,
when a new array will be created and returned as a result. In dynamic mode, ``array`` is a Python list.
But in static mode, array is a Tensor whose ``VarType`` is ``LOD_TENSOR_ARRAY``.
Returns:
list|Tensor: The input ``array`` after ``x`` is written into.
Examples:
.. code-block:: python
import paddle
arr = paddle.tensor.create_array(dtype="float32")
x = paddle.full(shape=[1, 3], fill_value=5, dtype="float32")
i = paddle.zeros(shape=[1], dtype="int32")
arr = paddle.tensor.array_write(x, i, array=arr)
item = paddle.tensor.array_read(arr, i)
print(item) # [[5., 5., 5.]]
"""
return layers.array_write(x, i, array)
def create_array(dtype):
"""
This OP creates an array. It is used as the input of :ref:`api_paddle_tensor_array_array_read` and
:ref:`api_paddle_tensor_array_array_write`.
Args:
dtype (str): The data type of the elements in the array. Support data type: float32, float64, int32, int64 and bool.
Returns:
list|Tensor: An empty array. In dynamic mode, ``array`` is a Python list. But in static mode, array is a Tensor
whose ``VarType`` is ``LOD_TENSOR_ARRAY``.
Examples:
.. code-block:: python
import paddle
arr = paddle.tensor.create_array(dtype="float32")
x = paddle.full(shape=[1, 3], fill_value=5, dtype="float32")
i = paddle.zeros(shape=[1], dtype="int32")
arr = paddle.tensor.array_write(x, i, array=arr)
item = paddle.tensor.array_read(arr, i)
print(item) # [[5., 5., 5.]]
"""
return layers.create_array(dtype)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册