Robonaissance

Robonaissance

Written in Python, Part 2: The Array Became the Unit of Thought

A slow language cannot drive fast hardware one number at a time. The fix was an object, not a compiler. It came out of astronomy and a tenure clock. Deep learning inherited it rather than building it.

Hugo's avatar
Hugo
Jul 28, 2026
∙ Paid

A series on how one language shaped artificial intelligence, and how intelligence is now reshaping it.


The Man Who Built the Floor and Left

In 1995 a graduate student at MIT named Jim Hugunin wrote a Python extension called Numeric. He did not start from nothing. He built on earlier work by Jim Fulton, then at the United States Geological Survey, and took input from a scattered handful of people who wanted to do arithmetic on large collections of numbers without leaving a language they liked. Numeric gave Python an N-dimensional array object, a C interface for extending it, and a set of operations that applied to whole arrays at once.

Every frontier model trained today descends from that object. The tensor in PyTorch, the array in JAX, the buffer that Isaac Gym hands to a policy network, all of them are the same idea wearing thirty years of engineering.

Hugunin left.

In 1997 he joined the Corporation for National Research Initiatives to work on JPython, an implementation of Python targeting the Java virtual machine. He later built IronPython for the .NET platform, co-designed the AspectJ extension for Java, and worked at Microsoft from 2004 to 2010, mostly on IronPython and the Dynamic Language Runtime. He did not come back. Travis Oliphant, who would spend years of his own life on the thing Hugunin started, has said plainly that Hugunin has not worked in the Python space for years.

There is a shape to that career worth noticing. Having answered the question of what Python should compute on, Hugunin spent the next decade on the question of where Python should run. Both are questions about the layer beneath the language, which is where he seems to have wanted to be. Neither of the runtimes he built became the one that mattered. The array he wrote first, and apparently thought about least in the years after, is the one that ended up underneath everything.

Maintenance of Numeric passed to Paul Dubois at Lawrence Livermore National Laboratory. Others accumulated around it: David Ascher, Konrad Hinsen, Tim Peters, Oliphant himself.

The project’s name accumulated too, and the mess it made is a small comic monument to how these things actually go. Numeric was also called Numerical Python. It was also called Numerical, which was the name of its source control module. Its project page was registered under the name numpy, roughly a decade before the package now called NumPy existed. Konrad Hinsen named his own package ScientificPython in reference to Numerical Python, which produced a lasting confusion with SciPy, a different project entirely. For years, telling someone which array package you used required naming a version number and a source, and the community had no vocabulary that reliably distinguished the thing from its successors and rivals. A field cannot standardize on an object it cannot unambiguously name, and that turned out to be a real cost rather than a joke.

This is a normal enough story in open source and it is worth pausing on anyway, because the field that now depends on that object tells its own history as a sequence of breakthroughs by people who stayed. The array was built by someone who went to work on something else, and then rebuilt, a decade later, by someone with no professional reason to do it. Neither of them was working on artificial intelligence. Both of them were solving a problem in front of them, and the problem was the same problem: Python could not do arithmetic fast enough to be useful, and everybody could see it.

User's avatar

Continue reading this post for free, courtesy of Hugo.

Or purchase a paid subscription.
© 2026 Robonaissance · Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture