Vectorized call over positional arguments with a signature.
(self, func, args)
| 2617 | return res |
| 2618 | |
| 2619 | def _vectorize_call_with_signature(self, func, args): |
| 2620 | """Vectorized call over positional arguments with a signature.""" |
| 2621 | input_core_dims, output_core_dims = self._in_and_out_core_dims |
| 2622 | |
| 2623 | if len(args) != len(input_core_dims): |
| 2624 | raise TypeError( |
| 2625 | 'wrong number of positional arguments: ' |
| 2626 | f'expected {len(input_core_dims)!r}, got {len(args)!r}' |
| 2627 | ) |
| 2628 | args = tuple(asanyarray(arg) for arg in args) |
| 2629 | |
| 2630 | broadcast_shape, dim_sizes = _parse_input_dimensions( |
| 2631 | args, input_core_dims) |
| 2632 | input_shapes = _calculate_shapes(broadcast_shape, dim_sizes, |
| 2633 | input_core_dims) |
| 2634 | args = [np.broadcast_to(arg, shape, subok=True) |
| 2635 | for arg, shape in zip(args, input_shapes)] |
| 2636 | |
| 2637 | outputs = None |
| 2638 | otypes = self.otypes |
| 2639 | nout = len(output_core_dims) |
| 2640 | |
| 2641 | for index in np.ndindex(*broadcast_shape): |
| 2642 | results = func(*(arg[index] for arg in args)) |
| 2643 | |
| 2644 | n_results = len(results) if isinstance(results, tuple) else 1 |
| 2645 | |
| 2646 | if nout != n_results: |
| 2647 | raise ValueError( |
| 2648 | f'wrong number of outputs from pyfunc: expected {nout!r}, ' |
| 2649 | f'got {n_results!r}' |
| 2650 | ) |
| 2651 | |
| 2652 | if nout == 1: |
| 2653 | results = (results,) |
| 2654 | |
| 2655 | if outputs is None: |
| 2656 | for result, core_dims in zip(results, output_core_dims): |
| 2657 | _update_dim_sizes(dim_sizes, result, core_dims) |
| 2658 | |
| 2659 | outputs = _create_arrays(broadcast_shape, dim_sizes, |
| 2660 | output_core_dims, otypes, results) |
| 2661 | |
| 2662 | for output, result in zip(outputs, results): |
| 2663 | output[index] = result |
| 2664 | |
| 2665 | if outputs is None: |
| 2666 | # did not call the function even once |
| 2667 | if otypes is None: |
| 2668 | raise ValueError('cannot call `vectorize` on size 0 inputs ' |
| 2669 | 'unless `otypes` is set') |
| 2670 | if builtins.any(dim not in dim_sizes |
| 2671 | for dims in output_core_dims |
| 2672 | for dim in dims): |
| 2673 | raise ValueError('cannot call `vectorize` with a signature ' |
| 2674 | 'including new output dimensions on size 0 ' |
| 2675 | 'inputs') |
| 2676 | outputs = _create_arrays(broadcast_shape, dim_sizes, |
no test coverage detected