Parameter sweeps#

Use PyMieSim.Experiment and set classes when several values should be evaluated as a parameter grid.

import numpy as np

from PyMieSim import (
    Experiment,
    GaussianSet,
    PolarizationSet,
    SphereSet,
    ureg,
)

source = GaussianSet(
    wavelength=np.linspace(400, 800, 5) * ureg.nanometer,
    polarization=PolarizationSet(angles=[0] * ureg.degree),
    optical_power=[1e-3] * ureg.watt,
    numerical_aperture=[0.2],
)

scatterer = SphereSet(
    diameter=np.linspace(100, 500, 10) * ureg.nanometer,
    material=[1.5],
    medium=[1.0],
)

experiment = Experiment(scatterer_set=scatterer, source_set=source)
result = experiment.get("Qsca", "Qext")
result.isel({"measure": 0}).plot(x="source:wavelength", y="Qsca")

The result is a unit-aware PyMieSim LabeledArray. Use .as_numpy() when a raw NumPy array is preferable, .as_dataframe() for tabular interoperability, or get_sequential for aligned sequential configurations.

Extracting NumPy and pandas data#

The experiment result remains labeled by default. Convert it explicitly when using libraries that expect a raw array or a pandas table:

result = experiment.get("Qsca")

values = result.as_numpy()
print(values.shape)

dataframe = result.as_dataframe()
print(dataframe[["source:wavelength", "scatterer:diameter", "Qsca"]])

For multiple measures, the labeled array contains a measure dimension and as_dataframe() creates one output column per measure:

result = experiment.get("Qext", "Qsca")
dataframe = result.as_dataframe()
# Columns: source:wavelength, scatterer:diameter, Qext, Qsca

See the experiment gallery for larger examples.