File: C:/Users/fred/anaconda3/Lib/site-packages/astropy/uncertainty/tests/test_functions.py
# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""Test numpy functions and ufuncs on Distribution.
The tests here are fairly detailed but do not aim for complete
coverage. Complete coverage of all numpy functions will be done
in test_function_helpers.
TODO: start test_function_helpers once more functions are supported.
"""
import numpy as np
from numpy.testing import assert_array_equal
from astropy import units as u
from astropy.uncertainty import Distribution
class ArraySetup:
@classmethod
def setup_class(self):
self.a = (
np.array([[[0.0]], [[10.0]]])
+ np.array([[0.0], [1.0], [2.0]])
+ np.arange(4.0) / 10.0
)
self.b = -(np.arange(3.0, 6.0)[:, np.newaxis] + np.arange(4.0) / 10.0)
self.da = Distribution(self.a)
self.db = Distribution(self.b)
self.c = np.array([[200.0], [300.0]])
class QuantitySetup(ArraySetup):
@classmethod
def setup_class(self):
super().setup_class()
self.a <<= u.m
self.b <<= u.km
self.da <<= u.m
self.db <<= u.km
self.c <<= u.Mm
class TestConcatenation(ArraySetup):
def test_concatenate(self):
# Concatenate needs consistent shapes.
db = self.db[np.newaxis]
concat_a_b = np.concatenate((self.da, db), axis=0)
expected_distr = np.concatenate((self.a, self.b[np.newaxis]), axis=0)
assert_array_equal(concat_a_b.distribution, expected_distr)
def test_concatenate_not_all_distribution(self):
concat_c_a = np.concatenate((self.c, self.da), axis=1)
assert isinstance(concat_c_a, Distribution)
c_bcst = np.broadcast_to(
self.c[..., np.newaxis], self.c.shape + (self.da.n_samples,), subok=True
)
expected_distr = np.concatenate((c_bcst, self.a), axis=1)
assert_array_equal(concat_c_a.distribution, expected_distr)
class TestQuantityDistributionConcatenation(TestConcatenation, QuantitySetup):
pass
class TestBroadcast(ArraySetup):
def test_broadcast_to(self):
shape = self.da.shape
ba = np.broadcast_to(self.db, shape, subok=True)
assert ba.shape == shape
expected_distr = np.broadcast_to(self.b, self.a.shape, subok=True)
assert_array_equal(ba.distribution, expected_distr)
def test_broadcast_arrays(self):
bda, bdb, bdc = np.broadcast_arrays(self.da, self.db, self.c, subok=True)
assert type(bda) is type(bdb) is type(self.da)
assert type(bdc) is type(self.c)
ba, bb = np.broadcast_arrays(self.a, self.b, subok=True)
bc = np.broadcast_to(self.c, self.da.shape, subok=True)
assert_array_equal(bda.distribution, ba)
assert_array_equal(bdb.distribution, bb)
assert_array_equal(bdc, bc)
def test_broadcast_arrays_subok_false(self):
# subok affects ndarray subclasses but not distribution itself.
bda, bdb, bdc = np.broadcast_arrays(self.da, self.db, self.c, subok=False)
assert type(bda.distribution) is type(bdb.distribution) is np.ndarray
assert type(bdc) is np.ndarray
ba, bb = np.broadcast_arrays(self.a, self.b, subok=False)
bc = np.broadcast_to(self.c, self.da.shape, subok=False)
assert_array_equal(bda.distribution, ba)
assert_array_equal(bdb.distribution, bb)
assert_array_equal(bdc, bc)
class TestQuantityDistributionBroadcast(TestBroadcast, QuantitySetup):
pass