scipp.elemwise_func#
- scipp.elemwise_func(func=None, *, unit_func=None, dtype='float64', auto_convert_dtypes=False)#
Create a function for transforming input variables based on element-wise operation.
This uses
numba.cfunc
to compile a kernel that Scipp can use for transforming the variable contents. Only variables with dtype=float64 are supported. Variances are not supported.Custom kernels can reduce intermediate memory consumption and improve performance in multi-step operations with large input variables.
- Parameters:
func (
Optional
[Callable
], default:None
) – Function to compute an output element from input element values.unit_func (
Optional
[Callable
], default:None
) – Function to compute the output unit. IfNone
,func
will be used.auto_convert_dtypes (
bool
, default:False
) – Set toTrue
to automatically convert all inputs to float64.
- Returns:
Callable
– A callable that appliesfunc
to the elements of the variables passed to it.
Examples
We can define a fused multiply-add operation as follows:
>>> def fmadd(a, b, c): ... return a * b + c
>>> func = sc.elemwise_func(fmadd)
>>> x = sc.linspace('x', 0.0, 1.0, num=4, unit='m') >>> y = x - 0.2 * x >>> z = sc.scalar(1.2, unit='m**2')
>>> func(x, y, z) <scipp.Variable> (x: 4) float64 [m^2] [1.2, 1.28889, 1.55556, 2]
Note that
fmadd(x, y, z)
would have the same effect in this case, but requires a potentially large intermediate allocation for the result of “a * b”.