Charles R. Harris 1 , K. Jarrod Millman , 2 , 3 , 4 , Stéfan J. van der Walt , 2 , 4 , 5 , Ralf Gommers , 6 , Pauli Virtanen 7 , 8 , David Cournapeau 9 , Eric Wieser 10 , Julian Taylor 11 , Sebastian Berg 4 , Nathaniel J. Smith 12 , Robert Kern 13 , Matti Picus 4 , Stephan Hoyer 14 , Marten H. van Kerkwijk 15 , Matthew Brett 2 , 16 , Allan Haldane 17 , Jaime Fernández del Río 18 , Mark Wiebe 19 , 20 , Pearu Peterson 6 , 21 , 22 , Pierre Gérard-Marchant 23 , 24 , Kevin Sheppard 25 , Tyler Reddy 26 , Warren Weckesser 4 , Hameer Abbasi 6 , Christoph Gohlke 27 , Travis E. Oliphant 6
16 September 2020
Array programming provides a powerful, compact and expressive syntax for accessing, manipulating and operating on data in vectors, matrices and higher-dimensional arrays. NumPy is the primary array programming library for the Python language. It has an essential role in research analysis pipelines in fields as diverse as physics, chemistry, astronomy, geoscience, biology, psychology, materials science, engineering, finance and economics. For example, in astronomy, NumPy was an important part of the software stack used in the discovery of gravitational waves 1 and in the first imaging of a black hole 2 . Here we review how a few fundamental array concepts lead to a simple and powerful programming paradigm for organizing, exploring and analysing scientific data. NumPy is the foundation upon which the scientific Python ecosystem is constructed. It is so pervasive that several projects, targeting audiences with specialized needs, have developed their own NumPy-like interfaces and array objects. Owing to its central position in the ecosystem, NumPy increasingly acts as an interoperability layer between such array computation libraries and, together with its application programming interface (API), provides a flexible framework to support the next decade of scientific and industrial analysis.
NumPy is the primary array programming library for Python; here its fundamental concepts are reviewed and its evolution into a flexible interoperability layer between increasingly specialized computational libraries is discussed.