Vectorized call over positional arguments with a signature.
(self, func, args)
| 2462 | return res |
| 2463 | |
| 2464 | def _vectorize_call_with_signature(self, func, args): |
| 2465 | """Vectorized call over positional arguments with a signature.""" |
| 2466 | input_core_dims, output_core_dims = self._in_and_out_core_dims |
| 2467 | |
| 2468 | if len(args) != len(input_core_dims): |
| 2469 | raise TypeError('wrong number of positional arguments: ' |
| 2470 | 'expected %r, got %r' |
| 2471 | % (len(input_core_dims), len(args))) |
| 2472 | args = tuple(asanyarray(arg) for arg in args) |
| 2473 | |
| 2474 | broadcast_shape, dim_sizes = _parse_input_dimensions( |
| 2475 | args, input_core_dims) |
| 2476 | input_shapes = _calculate_shapes(broadcast_shape, dim_sizes, |
| 2477 | input_core_dims) |
| 2478 | args = [np.broadcast_to(arg, shape, subok=True) |
| 2479 | for arg, shape in zip(args, input_shapes)] |
| 2480 | |
| 2481 | outputs = None |
| 2482 | otypes = self.otypes |
| 2483 | nout = len(output_core_dims) |
| 2484 | |
| 2485 | for index in np.ndindex(*broadcast_shape): |
| 2486 | results = func(*(arg[index] for arg in args)) |
| 2487 | |
| 2488 | n_results = len(results) if isinstance(results, tuple) else 1 |
| 2489 | |
| 2490 | if nout != n_results: |
| 2491 | raise ValueError( |
| 2492 | 'wrong number of outputs from pyfunc: expected %r, got %r' |
| 2493 | % (nout, n_results)) |
| 2494 | |
| 2495 | if nout == 1: |
| 2496 | results = (results,) |
| 2497 | |
| 2498 | if outputs is None: |
| 2499 | for result, core_dims in zip(results, output_core_dims): |
| 2500 | _update_dim_sizes(dim_sizes, result, core_dims) |
| 2501 | |
| 2502 | outputs = _create_arrays(broadcast_shape, dim_sizes, |
| 2503 | output_core_dims, otypes, results) |
| 2504 | |
| 2505 | for output, result in zip(outputs, results): |
| 2506 | output[index] = result |
| 2507 | |
| 2508 | if outputs is None: |
| 2509 | # did not call the function even once |
| 2510 | if otypes is None: |
| 2511 | raise ValueError('cannot call `vectorize` on size 0 inputs ' |
| 2512 | 'unless `otypes` is set') |
| 2513 | if builtins.any(dim not in dim_sizes |
| 2514 | for dims in output_core_dims |
| 2515 | for dim in dims): |
| 2516 | raise ValueError('cannot call `vectorize` with a signature ' |
| 2517 | 'including new output dimensions on size 0 ' |
| 2518 | 'inputs') |
| 2519 | outputs = _create_arrays(broadcast_shape, dim_sizes, |
| 2520 | output_core_dims, otypes) |
| 2521 |
no test coverage detected