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 ce0caf1
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
22 changes: 22 additions & 0 deletions colour/colorimetry/spectrum.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,28 @@ 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):
raise RuntimeError("data values must have equal spacing")

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 ce0caf1

Please sign in to comment.