jax-ml/jax · error · TypeError

x argument to bincount must have an integer type; got {x.dty

Error message

x argument to bincount must have an integer type; got {x.dtype}

What it means

jnp.bincount counts occurrences of integer values, so the input x must have an integer dtype. Float or complex inputs are rejected with a TypeError (bools are auto-cast to int32).

Source

Thrown at jax/_src/numpy/lax_numpy.py:2961

    Specifying a static ``length`` makes this jit-compatible:

    >>> jit_bincount = jax.jit(jnp.bincount, static_argnames=['length'])
    >>> jit_bincount(x, length=5)
    Array([0, 2, 1, 3, 0], dtype=int32)

    Any negative numbers are clipped to the first bin, and numbers beyond the
    specified ``length`` are dropped:

    >>> x = jnp.array([-1, -1, 1, 3, 10])
    >>> jnp.bincount(x, length=5)
    Array([2, 1, 0, 1, 0], dtype=int32)
  """
  x = util.ensure_arraylike("bincount", x)
  if x.dtype == bool:
    x = lax.convert_element_type(x, 'int32')
  if not issubdtype(x.dtype, np.integer):
    raise TypeError(f"x argument to bincount must have an integer type; got {x.dtype}")
  if np.ndim(x) != 1:
    raise ValueError("only 1-dimensional input supported.")
  minlength = core.concrete_or_error(
      operator.index, minlength,
      "The error occurred because of argument 'minlength' of jnp.bincount.")
  if length is None:
    x_arr = core.concrete_or_error(
        asarray, x,
        "The error occurred because of argument 'x' of jnp.bincount. "
        "To avoid this error, pass a static `length` argument.")
    length = max(minlength, x_arr.size and int(max(0, x_arr.max())) + 1)
  else:
    length = core.concrete_dim_or_error(
        length,
        "The error occurred because of argument 'length' of jnp.bincount.")

  if weights is None:
    weights = np.array(1, dtype=dtypes.int_)

View on GitHub (pinned to 1e1c6a8fc0)

Solutions

  1. Cast to integer: jnp.bincount(x.astype(jnp.int32))
  2. If values are class probabilities, take argmax first: jnp.bincount(jnp.argmax(x, axis=-1))
  3. Note bool input is handled automatically; no cast needed there

Example fix

// before
jnp.bincount(jnp.array([0.1, 1.7, 1.2, 0.0]))
// after
jnp.bincount(jnp.floor(x).astype(jnp.int32))
Defensive patterns

Strategy: type-guard

Validate before calling

if not jnp.issubdtype(x.dtype, jnp.integer) and x.dtype != jnp.bool_:
    x = x.astype(jnp.int32)

Type guard

def is_integer_like(a) -> bool:
    return jnp.issubdtype(a.dtype, jnp.integer) or a.dtype == jnp.bool_

Prevention

When it happens

Trigger: Calling jnp.bincount(jnp.array([0.5, 1.0, 1.5])) or bincount on float32/float64 logits, indices from argmax on float arrays, or complex arrays.

Common situations: Counting values after computing indices without casting; passing probabilities or normalized floats directly; feeding output of a float pipeline into a histogram-like count.

Related errors


AI-assisted analysis of jax-ml/jax@1e1c6a8fc0 (2026-08-27). Data as JSON: /api/errors/9840c2271f5c6454. Report an issue: GitHub.