diff --git a/colour/colorimetry/spectrum.py b/colour/colorimetry/spectrum.py index 04e4b7bcc..10968f8c1 100644 --- a/colour/colorimetry/spectrum.py +++ b/colour/colorimetry/spectrum.py @@ -158,6 +158,29 @@ def __init__(self, start: Real, end: Real, interval: Real) -> None: self.end = end self.interval = interval + @classmethod + def from_array(cls, data: ArrayLike) -> SpectralShape: + """Alternate constructor, create a SpectralShape from an ArrayLike list + of values. Values must be evenly spaced. + + Parameters + ---------- + data : ArrayLike + The wavelength list + + Returns + ------- + SpectralShape + """ + data = np.asarray(data) + + spacing = (diff_intermediate := np.diff(data))[0] + if ~np.all(diff_intermediate == spacing): + error = "data values must have equal spacing" + raise RuntimeError(error) + + return SpectralShape(data[0], data[-1], spacing) + @property def start(self) -> Real: """ diff --git a/colour/colorimetry/tests/test_spectrum.py b/colour/colorimetry/tests/test_spectrum.py index c72a1ad1f..d1566d459 100644 --- a/colour/colorimetry/tests/test_spectrum.py +++ b/colour/colorimetry/tests/test_spectrum.py @@ -1417,6 +1417,21 @@ def test_range(self) -> None: np.arange(0, 10 + 0.1, 0.1), ) + def test_from_data(self) -> None: + """Test :func:`colour.colorimetry.spectrum.SpectralShape.from_array`""" + data = np.arange(400, 700 + 1, 10) # arange generates [start, stop) + shape = SpectralShape.from_array(data) + + assert shape.start == 400 + assert shape.end == 700 + assert shape.interval == 10 + + assert shape == SpectralShape(400, 700, 10) + + with pytest.raises(RuntimeError): + data = [400, 450, 500, 555, 600, 650, 700] + SpectralShape.from_array(data) + class TestSpectralDistribution: """