{"record":{"id":"a049a6198992ff59","repo":"jax-ml/jax","slug":"attempt-to-get-argmin-of-an-empty-sequence","errorCode":null,"errorMessage":"attempt to get argmin of an empty sequence","messagePattern":"attempt to get argmin of an empty sequence","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/numpy/lax_numpy.py","lineNumber":8347,"sourceCode":"    Array([[0],\n           [2]], dtype=int32)\n  \"\"\"\n  arr = util.ensure_arraylike(\"argmin\", a)\n  if out is not None:\n    raise NotImplementedError(\"The 'out' argument to jnp.argmin is not supported.\")\n  return _argmin(arr, None if axis is None else operator.index(axis),\n                 keepdims=bool(keepdims))\n\n@api.jit(static_argnames=('axis', 'keepdims'), inline=True)\ndef _argmin(a: Array, axis: int | None = None, keepdims: bool = False) -> Array:\n  if axis is None:\n    dims = list(range(np.ndim(a)))\n    a = ravel(a)\n    axis = 0\n  else:\n    dims = [axis]\n  if a.shape[axis] == 0:\n    raise ValueError(\"attempt to get argmin of an empty sequence\")\n  # TODO(phawkins): use an int64 index if the dimension is large enough.\n  result = lax.argmin(a, _canonicalize_axis(axis, a.ndim), int)\n  return expand_dims(result, dims) if keepdims else result\n\n\n@export\ndef nanargmax(\n    a: ArrayLike,\n    axis: int | None = None,\n    out: None = None,\n    keepdims: bool | None = None,\n) -> Array:\n  \"\"\"Return the index of the maximum value of an array, ignoring NaNs.\n\n  JAX implementation of :func:`numpy.nanargmax`.\n\n  Args:\n    a: input array","sourceCodeStart":8329,"sourceCodeEnd":8365,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/numpy/lax_numpy.py#L8329-L8365","documentation":"Raised by jnp.argmin when the array has zero elements along the reduced axis; a minimum index over an empty sequence is undefined so JAX raises ValueError before dispatching.","triggerScenarios":"jnp.argmin(jnp.array([])); jnp.argmin(a, axis=k) with a.shape[k] == 0; empty result after boolean masking or slicing in jit-compiled code.","commonSituations":"Empty minibatches, all-elements-filtered arrays, boundary conditions in loops producing zero-length slices.","solutions":["Check size before calling and handle empty explicitly (return a default index or skip)","Ensure upstream filtering guarantees at least one element","Pad with +inf sentinel and post-process the sentinel index"],"exampleFix":"// before\nbest = jnp.argmin(losses)  # losses may be empty\n// after\nbest = jnp.argmin(losses) if losses.size else 0\n","handlingStrategy":"validation","validationCode":"if a.size == 0: return 0  # or skip\nreturn int(jnp.argmin(a))","typeGuard":"def nonempty_for_argmin(a, axis=None):\n    a = jnp.asarray(a)\n    return a.size > 0 if axis is None else a.shape[axis] > 0","tryCatchPattern":"try:\n    idx = jnp.argmin(a)\nexcept ValueError as e:\n    if 'empty sequence' in str(e):\n        idx = 0\n    else:\n        raise","preventionTips":["Check .size before argmin on masked data","Guarantee filters keep >= 1 element","Pad with +inf sentinel for data-dependent cases under jit"],"tags":["jax","argmin","empty-array"],"backgroundTag":"argmax-of-empty-array","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}