Skip to content

TYP: vectorize shape-typing - #32743

Merged
charris merged 1 commit into
numpy:mainfrom
jorenham:typing/vectorize/shape-typing
Sep 22, 2026
Merged

charris merged 1 commit into
numpy:mainfrom
jorenham:typing/vectorize/shape-typing

Conversation

@jorenham

@jorenham jorenham commented Sep 21, 2026 •

Copy link
Copy Markdown
Member

np.vectorize now has shape-typing support, and has been made aware of the arity and return type of the vectorized user function.
It was a bit tricky to get this right because vectorize can both be used as a decorator and directly, and then there's also the signature which influences the output. After hammering at it to get it as simple as feasible, I'm pretty happy with how it turned out.

import numpy as np

def relu(x: float) -> float:
    return max(x, 0.0)

image = np.ones((2, 3))

reveal_type(np.vectorize(relu)(image))
# before: Any
# after:  ndarray[tuple[int, int], dtype[float64]]

reveal_type(np.vectorize(str)(np.arange(3)))
# before: Any
# after:  ndarray[tuple[int], dtype[str_]]

Pair programmed with AI.

@jorenham jorenham added this to the 2.6.0 Release milestone Sep 21, 2026
@jorenham
jorenham force-pushed the typing/vectorize/shape-typing branch from f395073 to 76cf1bc Compare September 21, 2026 20:33
@github-actions

Copy link
Copy Markdown

Diff from mypy_primer, showing the effect of this PR on type check results on a corpus of open source code:

pandas (https://github.com/pandas-dev/pandas)
+ pandas/io/stata.py:352: error: Incompatible types in assignment (expression has type "vectorize[signedinteger[_32Bit | _64Bit], Callable[[datetime], int]]", variable has type "vectorize[float64, Callable[[timedelta], float]]")  [assignment]

@jorenham

Copy link
Copy Markdown
Member Author

The new mypy error for pandas (src) is a classic reassignment issue, where the result of different incompatible np.vectorize calls is (re)assigned to the same variable v, which mypy doesn't like, but can be resolved by tweaking the mypy config in pandas so that mypy uses a more modern inference strategy.

@charris
charris merged commit 0400d36 into numpy:main Sep 22, 2026
15 checks passed
@charris

charris commented Sep 22, 2026

Copy link
Copy Markdown
Member

Thanks Joren.

@jorenham
jorenham deleted the typing/vectorize/shape-typing branch September 22, 2026 18:10
Riaz1729 pushed a commit to Riaz1729/numpy that referenced this pull request Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants