Files
paddlepaddle--paddle/test/legacy_test/test_compat_median.py
T
2026-07-13 12:40:42 +08:00

306 lines
12 KiB
Python

# Copyright (c) 2024 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.
import unittest
import numpy as np
import paddle
from paddle import base
class TestCompatMedianAPI(unittest.TestCase):
def test_compat_median_basic(self):
paddle.disable_static()
x = paddle.to_tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32')
result = paddle.compat.median(x)
expected = paddle.to_tensor(5, dtype='float32')
np.testing.assert_allclose(result.numpy(), expected.numpy())
values, indices = paddle.compat.median(x, dim=1)
expected_values = paddle.to_tensor([2, 5, 8], dtype='float32')
expected_indices = paddle.to_tensor([1, 1, 1], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
result = paddle.compat.median(x, dim=1)
np.testing.assert_allclose(
result.values.numpy(), expected_values.numpy()
)
np.testing.assert_allclose(
result.indices.numpy(), expected_indices.numpy()
)
values, indices = paddle.compat.median(x, dim=1, keepdim=True)
expected_values = paddle.to_tensor([[2], [5], [8]], dtype='float32')
expected_indices = paddle.to_tensor([[1], [1], [1]], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
paddle.enable_static()
def test_compat_median_out(self):
paddle.disable_static()
x = paddle.to_tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32')
out = paddle.zeros([], dtype='float32')
result = paddle.compat.median(x, out=out)
expected = paddle.to_tensor(5, dtype='float32')
np.testing.assert_allclose(result.numpy(), expected.numpy())
np.testing.assert_allclose(out.numpy(), expected.numpy())
self.assertIs(result, out)
out_values = paddle.zeros([3], dtype='float32')
out_indices = paddle.zeros([3], dtype='int64')
result_values, result_indices = paddle.compat.median(
x, dim=1, out=(out_values, out_indices)
)
expected_values = paddle.to_tensor([2, 5, 8], dtype='float32')
expected_indices = paddle.to_tensor([1, 1, 1], dtype='int64')
np.testing.assert_allclose(
result_values.numpy(), expected_values.numpy()
)
np.testing.assert_allclose(
result_indices.numpy(), expected_indices.numpy()
)
np.testing.assert_allclose(out_values.numpy(), expected_values.numpy())
np.testing.assert_allclose(
out_indices.numpy(), expected_indices.numpy()
)
self.assertIs(result_values, out_values)
self.assertIs(result_indices, out_indices)
paddle.enable_static()
def test_compat_median_different_dims(self):
paddle.disable_static()
x = paddle.to_tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32')
values, indices = paddle.compat.median(x, dim=0)
expected_values = paddle.to_tensor([4, 5, 6], dtype='float32')
expected_indices = paddle.to_tensor([1, 1, 1], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
values, indices = paddle.compat.median(x, dim=1)
expected_values = paddle.to_tensor([2, 5, 8], dtype='float32')
expected_indices = paddle.to_tensor([1, 1, 1], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
values, indices = paddle.compat.median(x, dim=-1)
expected_values = paddle.to_tensor([2, 5, 8], dtype='float32')
expected_indices = paddle.to_tensor([1, 1, 1], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
paddle.enable_static()
def test_compat_median_static(self):
paddle.enable_static()
with paddle.static.program_guard(
paddle.static.Program(), paddle.static.Program()
):
x = paddle.static.data(name='x', shape=[3, 3], dtype='float32')
values, indices = paddle.compat.median(x, dim=1)
exe = base.Executor(base.CPUPlace())
x_data = np.array(
[[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32'
)
result_values, result_indices = exe.run(
feed={'x': x_data}, fetch_list=[values, indices]
)
expected_values = np.array([2, 5, 8], dtype='float32')
expected_indices = np.array([1, 1, 1], dtype='int64')
np.testing.assert_allclose(result_values, expected_values)
np.testing.assert_allclose(result_indices, expected_indices)
with paddle.static.program_guard(
paddle.static.Program(), paddle.static.Program()
):
x = paddle.static.data(name='x', shape=[3, 3], dtype='float32')
result = paddle.compat.median(x, dim=1)
exe = base.Executor(base.CPUPlace())
x_data = np.array(
[[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32'
)
result_values, result_indices = exe.run(
feed={'x': x_data}, fetch_list=[result.values, result.indices]
)
expected_values = np.array([2, 5, 8], dtype='float32')
expected_indices = np.array([1, 1, 1], dtype='int64')
np.testing.assert_allclose(result_values, expected_values)
np.testing.assert_allclose(result_indices, expected_indices)
paddle.disable_static()
class TestCompatNanmedianAPI(unittest.TestCase):
def test_compat_nanmedian_basic(self):
paddle.disable_static()
x = paddle.to_tensor(
[[1, float('nan'), 3], [4, 5, 6], [float('nan'), 8, 9]],
dtype='float32',
)
result = paddle.compat.nanmedian(x)
expected = paddle.to_tensor(5.0, dtype='float32')
np.testing.assert_allclose(result.numpy(), expected.numpy())
values, indices = paddle.compat.nanmedian(x, dim=1)
expected_values = paddle.to_tensor([1.0, 5.0, 8.0], dtype='float32')
expected_indices = paddle.to_tensor([0, 1, 1], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
result = paddle.compat.nanmedian(x, dim=1)
np.testing.assert_allclose(
result.values.numpy(), expected_values.numpy()
)
np.testing.assert_allclose(
result.indices.numpy(), expected_indices.numpy()
)
values, indices = paddle.compat.nanmedian(x, dim=-1)
expected_values = paddle.to_tensor([1.0, 5.0, 8.0], dtype='float32')
expected_indices = paddle.to_tensor([0, 1, 1], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
values, indices = paddle.compat.nanmedian(x, dim=1, keepdim=True)
expected_values = paddle.to_tensor(
[[1.0], [5.0], [8.0]], dtype='float32'
)
expected_indices = paddle.to_tensor([[0], [1], [1]], dtype='int64')
np.testing.assert_allclose(values.numpy(), expected_values.numpy())
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
paddle.enable_static()
def test_compat_nanmedian_out(self):
paddle.disable_static()
x = paddle.to_tensor(
[[1, float('nan'), 3], [4, 5, 6], [float('nan'), 8, 9]],
dtype='float32',
)
out = paddle.zeros([], dtype='float32')
result = paddle.compat.nanmedian(x, out=out)
expected = paddle.to_tensor(5.0, dtype='float32')
np.testing.assert_allclose(result.numpy(), expected.numpy())
np.testing.assert_allclose(out.numpy(), expected.numpy())
self.assertIs(result, out)
out_values = paddle.zeros([3], dtype='float32')
out_indices = paddle.zeros([3], dtype='int64')
result_values, result_indices = paddle.compat.nanmedian(
x, dim=1, out=(out_values, out_indices)
)
expected_values = paddle.to_tensor([1.0, 5.0, 8.0], dtype='float32')
expected_indices = paddle.to_tensor([0, 1, 1], dtype='int64')
np.testing.assert_allclose(
result_values.numpy(), expected_values.numpy()
)
np.testing.assert_allclose(
result_indices.numpy(), expected_indices.numpy()
)
np.testing.assert_allclose(out_values.numpy(), expected_values.numpy())
np.testing.assert_allclose(
out_indices.numpy(), expected_indices.numpy()
)
self.assertIs(result_values, out_values)
self.assertIs(result_indices, out_indices)
paddle.enable_static()
def test_compat_nanmedian_all_nan(self):
paddle.disable_static()
x = paddle.to_tensor(
[[1, 2, 3], [float('nan'), float('nan'), float('nan')], [7, 8, 9]],
dtype='float32',
)
values, indices = paddle.compat.nanmedian(x, dim=1)
expected_values = paddle.to_tensor(
[2.0, float('nan'), 8.0], dtype='float32'
)
expected_indices = paddle.to_tensor([1, 0, 1], dtype='int64')
np.testing.assert_allclose(
values.numpy(), expected_values.numpy(), equal_nan=True
)
np.testing.assert_allclose(indices.numpy(), expected_indices.numpy())
paddle.enable_static()
def test_compat_nanmedian_static(self):
paddle.enable_static()
with paddle.static.program_guard(
paddle.static.Program(), paddle.static.Program()
):
x = paddle.static.data(name='x', shape=[3, 3], dtype='float32')
values, indices = paddle.compat.nanmedian(x, dim=1)
exe = base.Executor(base.CPUPlace())
x_data = np.array(
[[1, float('nan'), 3], [4, 5, 6], [float('nan'), 8, 9]],
dtype='float32',
)
result_values, result_indices = exe.run(
feed={'x': x_data}, fetch_list=[values, indices]
)
expected_values = np.array([1.0, 5.0, 8.0], dtype='float32')
expected_indices = np.array([0, 1, 1], dtype='int64')
np.testing.assert_allclose(result_values, expected_values)
np.testing.assert_allclose(result_indices, expected_indices)
with paddle.static.program_guard(
paddle.static.Program(), paddle.static.Program()
):
x = paddle.static.data(name='x', shape=[3, 3], dtype='float32')
result = paddle.compat.nanmedian(x, dim=1)
exe = base.Executor(base.CPUPlace())
x_data = np.array(
[[1, float('nan'), 3], [4, 5, 6], [float('nan'), 8, 9]],
dtype='float32',
)
result_values, result_indices = exe.run(
feed={'x': x_data}, fetch_list=[result.values, result.indices]
)
expected_values = np.array([1.0, 5.0, 8.0], dtype='float32')
expected_indices = np.array([0, 1, 1], dtype='int64')
np.testing.assert_allclose(result_values, expected_values)
np.testing.assert_allclose(result_indices, expected_indices)
paddle.disable_static()
if __name__ == '__main__':
unittest.main()