Skip to content

Commit

Permalink
add alternate SpectralShape constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
tjdcs committed Jan 6, 2025
1 parent affff94 commit 715d256
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
23 changes: 23 additions & 0 deletions colour/colorimetry/spectrum.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
"""
Expand Down
15 changes: 15 additions & 0 deletions colour/colorimetry/tests/test_spectrum.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
"""
Expand Down

0 comments on commit 715d256

Please sign in to comment.