<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article SYSTEM "http://jats.nlm.nih.gov/archiving/1.2/JATS-archivearticle1.dtd"><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="review-article" xml:lang="en"><?properties open_access?><front><journal-meta><journal-id journal-id-type="publisher-id">41586</journal-id><journal-id journal-id-type="doi">10.1038/41586.1476-4687</journal-id><journal-title-group><journal-title>Nature</journal-title><journal-subtitle>International weekly journal of science</journal-subtitle><abbrev-journal-title abbrev-type="publisher">Nature</abbrev-journal-title></journal-title-group><issn pub-type="ppub">0028-0836</issn><issn pub-type="epub">1476-4687</issn><publisher><publisher-name>Nature Publishing Group UK</publisher-name><publisher-loc>London</publisher-loc></publisher></journal-meta><article-meta><article-id pub-id-type="publisher-id">s41586-020-2649-2</article-id><article-id pub-id-type="manuscript">2649</article-id><article-id pub-id-type="doi">10.1038/s41586-020-2649-2</article-id><article-categories><subj-group subj-group-type="heading"><subject>Review Article</subject></subj-group><subj-group subj-group-type="SubjectPath"><subject>/631/378/116</subject></subj-group><subj-group subj-group-type="SubjectPath"><subject>/704/525/870</subject></subj-group><subj-group subj-group-type="SubjectPath"><subject>/639/705/1042</subject></subj-group><subj-group subj-group-type="SubjectPath"><subject>/639/705/117</subject></subj-group><subj-group subj-group-type="SubjectPath"><subject>/639/705/794</subject></subj-group><subj-group subj-group-type="TechniquePath"><subject>/139</subject></subj-group><subj-group subj-group-type="NatureArticleTypeID"><subject>review-article</subject></subj-group></article-categories><title-group><article-title xml:lang="en">Array programming with NumPy</article-title></title-group><contrib-group><contrib contrib-type="author" id="Au1"><name><surname>Harris</surname><given-names>Charles R.</given-names></name><xref ref-type="aff" rid="Aff1">1</xref></contrib><contrib contrib-type="author" corresp="yes" id="Au2"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0002-5263-5070</contrib-id><name><surname>Millman</surname><given-names>K. Jarrod</given-names></name><xref ref-type="aff" rid="Aff2">2</xref><xref ref-type="aff" rid="Aff3">3</xref><xref ref-type="aff" rid="Aff4">4</xref><xref ref-type="corresp" rid="IDs4158602026492_cor2">b</xref></contrib><contrib contrib-type="author" corresp="yes" id="Au3"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0001-9276-1891</contrib-id><name><surname>van der Walt</surname><given-names>Stéfan J.</given-names></name><xref ref-type="aff" rid="Aff2">2</xref><xref ref-type="aff" rid="Aff4">4</xref><xref ref-type="aff" rid="Aff5">5</xref><xref ref-type="corresp" rid="IDs4158602026492_cor3">c</xref></contrib><contrib contrib-type="author" corresp="yes" id="Au4"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0002-0300-3333</contrib-id><name><surname>Gommers</surname><given-names>Ralf</given-names></name><xref ref-type="aff" rid="Aff6">6</xref><xref ref-type="corresp" rid="IDs4158602026492_cor4">d</xref></contrib><contrib contrib-type="author" id="Au5"><name><surname>Virtanen</surname><given-names>Pauli</given-names></name><xref ref-type="aff" rid="Aff7">7</xref><xref ref-type="aff" rid="Aff8">8</xref></contrib><contrib contrib-type="author" id="Au6"><name><surname>Cournapeau</surname><given-names>David</given-names></name><xref ref-type="aff" rid="Aff9">9</xref></contrib><contrib contrib-type="author" id="Au7"><name><surname>Wieser</surname><given-names>Eric</given-names></name><xref ref-type="aff" rid="Aff10">10</xref></contrib><contrib contrib-type="author" id="Au8"><name><surname>Taylor</surname><given-names>Julian</given-names></name><xref ref-type="aff" rid="Aff11">11</xref></contrib><contrib contrib-type="author" id="Au9"><name><surname>Berg</surname><given-names>Sebastian</given-names></name><xref ref-type="aff" rid="Aff4">4</xref></contrib><contrib contrib-type="author" id="Au10"><name><surname>Smith</surname><given-names>Nathaniel J.</given-names></name><xref ref-type="aff" rid="Aff12">12</xref></contrib><contrib contrib-type="author" id="Au11"><name><surname>Kern</surname><given-names>Robert</given-names></name><xref ref-type="aff" rid="Aff13">13</xref></contrib><contrib contrib-type="author" id="Au12"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0002-1771-9949</contrib-id><name><surname>Picus</surname><given-names>Matti</given-names></name><xref ref-type="aff" rid="Aff4">4</xref></contrib><contrib contrib-type="author" id="Au13"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0002-5207-0380</contrib-id><name><surname>Hoyer</surname><given-names>Stephan</given-names></name><xref ref-type="aff" rid="Aff14">14</xref></contrib><contrib contrib-type="author" id="Au14"><name><surname>van Kerkwijk</surname><given-names>Marten H.</given-names></name><xref ref-type="aff" rid="Aff15">15</xref></contrib><contrib contrib-type="author" id="Au15"><name><surname>Brett</surname><given-names>Matthew</given-names></name><xref ref-type="aff" rid="Aff2">2</xref><xref ref-type="aff" rid="Aff16">16</xref></contrib><contrib contrib-type="author" id="Au16"><name><surname>Haldane</surname><given-names>Allan</given-names></name><xref ref-type="aff" rid="Aff17">17</xref></contrib><contrib contrib-type="author" id="Au17"><name><surname>del Río</surname><given-names>Jaime Fernández</given-names></name><xref ref-type="aff" rid="Aff18">18</xref></contrib><contrib contrib-type="author" id="Au18"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0003-3603-8038</contrib-id><name><surname>Wiebe</surname><given-names>Mark</given-names></name><xref ref-type="aff" rid="Aff19">19</xref><xref ref-type="aff" rid="Aff20">20</xref></contrib><contrib contrib-type="author" id="Au19"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0001-7328-4305</contrib-id><name><surname>Peterson</surname><given-names>Pearu</given-names></name><xref ref-type="aff" rid="Aff6">6</xref><xref ref-type="aff" rid="Aff21">21</xref><xref ref-type="aff" rid="Aff22">22</xref></contrib><contrib contrib-type="author" id="Au20"><name><surname>Gérard-Marchant</surname><given-names>Pierre</given-names></name><xref ref-type="aff" rid="Aff23">23</xref><xref ref-type="aff" rid="Aff24">24</xref></contrib><contrib contrib-type="author" id="Au21"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0001-8700-2292</contrib-id><name><surname>Sheppard</surname><given-names>Kevin</given-names></name><xref ref-type="aff" rid="Aff25">25</xref></contrib><contrib contrib-type="author" id="Au22"><name><surname>Reddy</surname><given-names>Tyler</given-names></name><xref ref-type="aff" rid="Aff26">26</xref></contrib><contrib contrib-type="author" id="Au23"><name><surname>Weckesser</surname><given-names>Warren</given-names></name><xref ref-type="aff" rid="Aff4">4</xref></contrib><contrib contrib-type="author" id="Au24"><name><surname>Abbasi</surname><given-names>Hameer</given-names></name><xref ref-type="aff" rid="Aff6">6</xref></contrib><contrib contrib-type="author" id="Au25"><contrib-id contrib-id-type="orcid">http://orcid.org/0000-0001-8108-7707</contrib-id><name><surname>Gohlke</surname><given-names>Christoph</given-names></name><xref ref-type="aff" rid="Aff27">27</xref></contrib><contrib contrib-type="author" id="Au26"><name><surname>Oliphant</surname><given-names>Travis E.</given-names></name><xref ref-type="aff" rid="Aff6">6</xref></contrib><aff id="Aff1"><label>1</label><institution-wrap><institution content-type="org-name">Independent researcher</institution></institution-wrap><addr-line content-type="city">Logan</addr-line><addr-line content-type="state">UT</addr-line><country country="US">USA</country></aff><aff id="Aff2"><label>2</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2181 7878</institution-id><institution-id institution-id-type="GRID">grid.47840.3f</institution-id><institution content-type="org-division">Brain Imaging Center</institution><institution content-type="org-name">University of California, Berkeley</institution></institution-wrap><addr-line content-type="city">Berkeley</addr-line><addr-line content-type="state">CA</addr-line><country country="US">USA</country></aff><aff id="Aff3"><label>3</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2181 7878</institution-id><institution-id institution-id-type="GRID">grid.47840.3f</institution-id><institution content-type="org-division">Division of Biostatistics</institution><institution content-type="org-name">University of California, Berkeley</institution></institution-wrap><addr-line content-type="city">Berkeley</addr-line><addr-line content-type="state">CA</addr-line><country country="US">USA</country></aff><aff id="Aff4"><label>4</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2181 7878</institution-id><institution-id institution-id-type="GRID">grid.47840.3f</institution-id><institution content-type="org-division">Berkeley Institute for Data Science</institution><institution content-type="org-name">University of California, Berkeley</institution></institution-wrap><addr-line content-type="city">Berkeley</addr-line><addr-line content-type="state">CA</addr-line><country country="US">USA</country></aff><aff id="Aff5"><label>5</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2214 904X</institution-id><institution-id institution-id-type="GRID">grid.11956.3a</institution-id><institution content-type="org-name">Applied Mathematics, Stellenbosch University</institution></institution-wrap><addr-line content-type="city">Stellenbosch</addr-line><country country="ZA">South Africa</country></aff><aff id="Aff6"><label>6</label><institution-wrap><institution content-type="org-name">Quansight</institution></institution-wrap><addr-line content-type="city">Austin</addr-line><addr-line content-type="state">TX</addr-line><country country="US">USA</country></aff><aff id="Aff7"><label>7</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 1013 7965</institution-id><institution-id institution-id-type="GRID">grid.9681.6</institution-id><institution content-type="org-division">Department of Physics</institution><institution content-type="org-name">University of Jyväskylä</institution></institution-wrap><addr-line content-type="city">Jyväskylä</addr-line><country country="FI">Finland</country></aff><aff id="Aff8"><label>8</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 1013 7965</institution-id><institution-id institution-id-type="GRID">grid.9681.6</institution-id><institution content-type="org-division">Nanoscience Center</institution><institution content-type="org-name">University of Jyväskylä</institution></institution-wrap><addr-line content-type="city">Jyväskylä</addr-line><country country="FI">Finland</country></aff><aff id="Aff9"><label>9</label><institution-wrap><institution content-type="org-name">Mercari JP</institution></institution-wrap><addr-line content-type="city">Tokyo</addr-line><country country="JP">Japan</country></aff><aff id="Aff10"><label>10</label><institution-wrap><institution-id institution-id-type="ISNI">0000000121885934</institution-id><institution-id institution-id-type="GRID">grid.5335.0</institution-id><institution content-type="org-division">Department of Engineering</institution><institution content-type="org-name">University of Cambridge</institution></institution-wrap><addr-line content-type="city">Cambridge</addr-line><country country="GB">UK</country></aff><aff id="Aff11"><label>11</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2172 9288</institution-id><institution-id institution-id-type="GRID">grid.5949.1</institution-id><institution content-type="org-name">Independent researcher</institution></institution-wrap><addr-line content-type="city">Karlsruhe</addr-line><country country="DE">Germany</country></aff><aff id="Aff12"><label>12</label><institution-wrap><institution content-type="org-name">Independent researcher</institution></institution-wrap><addr-line content-type="city">Berkeley</addr-line><addr-line content-type="state">CA</addr-line><country country="US">USA</country></aff><aff id="Aff13"><label>13</label><institution-wrap><institution-id institution-id-type="GRID">grid.504464.7</institution-id><institution content-type="org-name">Enthought</institution></institution-wrap><addr-line content-type="city">Austin</addr-line><addr-line content-type="state">TX</addr-line><country country="US">USA</country></aff><aff id="Aff14"><label>14</label><institution-wrap><institution-id institution-id-type="GRID">grid.420451.6</institution-id><institution content-type="org-name">Google Research</institution></institution-wrap><addr-line content-type="city">Mountain View</addr-line><addr-line content-type="state">CA</addr-line><country country="US">USA</country></aff><aff id="Aff15"><label>15</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2157 2938</institution-id><institution-id institution-id-type="GRID">grid.17063.33</institution-id><institution content-type="org-division">Department of Astronomy and Astrophysics</institution><institution content-type="org-name">University of Toronto</institution></institution-wrap><addr-line content-type="city">Toronto</addr-line><addr-line content-type="state">Ontario</addr-line><country country="CA">Canada</country></aff><aff id="Aff16"><label>16</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0004 1936 7486</institution-id><institution-id institution-id-type="GRID">grid.6572.6</institution-id><institution content-type="org-division">School of Psychology</institution><institution content-type="org-name">University of Birmingham</institution></institution-wrap><addr-line content-type="city">Edgbaston</addr-line><addr-line content-type="state">Birmingham</addr-line><country country="GB">UK</country></aff><aff id="Aff17"><label>17</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2248 3398</institution-id><institution-id institution-id-type="GRID">grid.264727.2</institution-id><institution content-type="org-division">Department of Physics</institution><institution content-type="org-name">Temple University</institution></institution-wrap><addr-line content-type="city">Philadelphia</addr-line><addr-line content-type="state">PA</addr-line><country country="US">USA</country></aff><aff id="Aff18"><label>18</label><institution-wrap><institution-id institution-id-type="GRID">grid.472568.a</institution-id><institution content-type="org-name">Google</institution></institution-wrap><addr-line content-type="city">Zurich</addr-line><country country="CH">Switzerland</country></aff><aff id="Aff19"><label>19</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 2288 9830</institution-id><institution-id institution-id-type="GRID">grid.17091.3e</institution-id><institution content-type="org-division">Department of Physics and Astronomy</institution><institution content-type="org-name">The University of British Columbia</institution></institution-wrap><addr-line content-type="city">Vancouver</addr-line><addr-line content-type="state">British Columbia</addr-line><country country="CA">Canada</country></aff><aff id="Aff20"><label>20</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 0316 7795</institution-id><institution-id institution-id-type="GRID">grid.467171.2</institution-id><institution content-type="org-name">Amazon</institution></institution-wrap><addr-line content-type="city">Seattle</addr-line><addr-line content-type="state">WA</addr-line><country country="US">USA</country></aff><aff id="Aff21"><label>21</label><institution-wrap><institution content-type="org-name">Independent researcher</institution></institution-wrap><addr-line content-type="city">Saue</addr-line><country country="EE">Estonia</country></aff><aff id="Aff22"><label>22</label><institution-wrap><institution-id institution-id-type="ISNI">0000000110107715</institution-id><institution-id institution-id-type="GRID">grid.6988.f</institution-id><institution content-type="org-division">Department of Mechanics and Applied Mathematics</institution><institution content-type="org-name">Institute of Cybernetics at Tallinn Technical University</institution></institution-wrap><addr-line content-type="city">Tallinn</addr-line><country country="EE">Estonia</country></aff><aff id="Aff23"><label>23</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0004 1936 738X</institution-id><institution-id institution-id-type="GRID">grid.213876.9</institution-id><institution content-type="org-division">Department of Biological and Agricultural Engineering</institution><institution content-type="org-name">University of Georgia</institution></institution-wrap><addr-line content-type="city">Athens</addr-line><addr-line content-type="state">GA</addr-line><country country="US">USA</country></aff><aff id="Aff24"><label>24</label><institution-wrap><institution content-type="org-name">France-IX Services</institution></institution-wrap><addr-line content-type="city">Paris</addr-line><country country="FR">France</country></aff><aff id="Aff25"><label>25</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0004 1936 8948</institution-id><institution-id institution-id-type="GRID">grid.4991.5</institution-id><institution content-type="org-division">Department of Economics</institution><institution content-type="org-name">University of Oxford</institution></institution-wrap><addr-line content-type="city">Oxford</addr-line><country country="GB">UK</country></aff><aff id="Aff26"><label>26</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0004 0428 3079</institution-id><institution-id institution-id-type="GRID">grid.148313.c</institution-id><institution content-type="org-name">CCS-7, Los Alamos National Laboratory</institution></institution-wrap><addr-line content-type="city">Los Alamos</addr-line><addr-line content-type="state">NM</addr-line><country country="US">USA</country></aff><aff id="Aff27"><label>27</label><institution-wrap><institution-id institution-id-type="ISNI">0000 0001 0668 7243</institution-id><institution-id institution-id-type="GRID">grid.266093.8</institution-id><institution content-type="org-division">Laboratory for Fluorescence Dynamics, Biomedical Engineering Department</institution><institution content-type="org-name">University of California, Irvine</institution></institution-wrap><addr-line content-type="city">Irvine</addr-line><addr-line content-type="state">CA</addr-line><country country="US">USA</country></aff></contrib-group><author-notes><corresp id="IDs4158602026492_cor2"><label>b</label><email>millman@berkeley.edu</email></corresp><corresp id="IDs4158602026492_cor3"><label>c</label><email>stefanv@berkeley.edu</email></corresp><corresp id="IDs4158602026492_cor4"><label>d</label><email>ralf.gommers@gmail.com</email></corresp></author-notes><pub-date date-type="pub" publication-format="electronic"><day>16</day><month>9</month><year>2020</year></pub-date><pub-date date-type="pub" publication-format="print"><day>17</day><month>9</month><year>2020</year></pub-date><volume>585</volume><issue seq="26">7825</issue><fpage>357</fpage><lpage>362</lpage><history><date date-type="registration"><day>10</day><month>8</month><year>2020</year></date><date date-type="received"><day>21</day><month>2</month><year>2020</year></date><date date-type="accepted"><day>17</day><month>6</month><year>2020</year></date><date date-type="online"><day>16</day><month>9</month><year>2020</year></date></history><permissions><copyright-statement>© The Author(s) 2020</copyright-statement><copyright-year>2020</copyright-year><license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/"><license-p><bold>Open Access</bold> This article is licensed under a Creative Commons Attribution 4.0 International License, which permits use, sharing, adaptation, distribution and reproduction in any medium or format, as long as you give appropriate credit to the original author(s) and the source, provide a link to the Creative Commons license, and indicate if changes were made. The images or other third party material in this article are included in the article’s Creative Commons license, unless indicated otherwise in a credit line to the material. If material is not included in the article’s Creative Commons license and your intended use is not permitted by statutory regulation or exceeds the permitted use, you will need to obtain permission directly from the copyright holder. To view a copy of this license, visit <ext-link xlink:href="http://creativecommons.org/licenses/by/4.0/" ext-link-type="url">http://creativecommons.org/licenses/by/4.0/</ext-link>.</license-p></license></permissions><abstract id="Abs1" xml:lang="en"><title>Abstract</title><p id="Par1">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<sup><xref ref-type="bibr" rid="CR1">1</xref></sup> and in the first imaging of a black hole<sup><xref ref-type="bibr" rid="CR2">2</xref></sup>. 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.</p></abstract><abstract id="Abs2" xml:lang="en"><p id="Par2">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.</p></abstract><custom-meta-group><custom-meta><meta-name>publisher-imprint-name</meta-name><meta-value>Nature Research</meta-value></custom-meta><custom-meta><meta-name>volume-issue-count</meta-name><meta-value>4</meta-value></custom-meta><custom-meta><meta-name>issue-article-count</meta-name><meta-value>48</meta-value></custom-meta><custom-meta><meta-name>issue-toc-levels</meta-name><meta-value>0</meta-value></custom-meta><custom-meta><meta-name>issue-pricelist-year</meta-name><meta-value>2020</meta-value></custom-meta><custom-meta><meta-name>issue-copyright-holder</meta-name><meta-value>The Author(s), under exclusive licence to Springer Nature Limited</meta-value></custom-meta><custom-meta><meta-name>issue-copyright-year</meta-name><meta-value>2020</meta-value></custom-meta><custom-meta><meta-name>article-contains-esm</meta-name><meta-value>Yes</meta-value></custom-meta><custom-meta><meta-name>article-numbering-style</meta-name><meta-value>Unnumbered</meta-value></custom-meta><custom-meta><meta-name>article-registration-date-year</meta-name><meta-value>2020</meta-value></custom-meta><custom-meta><meta-name>article-registration-date-month</meta-name><meta-value>8</meta-value></custom-meta><custom-meta><meta-name>article-registration-date-day</meta-name><meta-value>10</meta-value></custom-meta><custom-meta><meta-name>article-toc-levels</meta-name><meta-value>0</meta-value></custom-meta><custom-meta><meta-name>toc-levels</meta-name><meta-value>0</meta-value></custom-meta><custom-meta><meta-name>volume-type</meta-name><meta-value>Regular</meta-value></custom-meta><custom-meta><meta-name>journal-product</meta-name><meta-value>NonStandardArchiveJournal</meta-value></custom-meta><custom-meta><meta-name>numbering-style</meta-name><meta-value>Unnumbered</meta-value></custom-meta><custom-meta><meta-name>article-grants-type</meta-name><meta-value>OpenChoice</meta-value></custom-meta><custom-meta><meta-name>metadata-grant</meta-name><meta-value>OpenAccess</meta-value></custom-meta><custom-meta><meta-name>abstract-grant</meta-name><meta-value>OpenAccess</meta-value></custom-meta><custom-meta><meta-name>bodypdf-grant</meta-name><meta-value>OpenAccess</meta-value></custom-meta><custom-meta><meta-name>bodyhtml-grant</meta-name><meta-value>OpenAccess</meta-value></custom-meta><custom-meta><meta-name>bibliography-grant</meta-name><meta-value>OpenAccess</meta-value></custom-meta><custom-meta><meta-name>esm-grant</meta-name><meta-value>OpenAccess</meta-value></custom-meta><custom-meta><meta-name>online-first</meta-name><meta-value>false</meta-value></custom-meta><custom-meta><meta-name>pdf-file-reference</meta-name><meta-value>BodyRef/PDF/41586_2020_Article_2649.pdf</meta-value></custom-meta><custom-meta><meta-name>pdf-type</meta-name><meta-value>Typeset</meta-value></custom-meta><custom-meta><meta-name>target-type</meta-name><meta-value>OnlinePDF</meta-value></custom-meta><custom-meta><meta-name>issue-online-date-year</meta-name><meta-value>2020</meta-value></custom-meta><custom-meta><meta-name>issue-online-date-month</meta-name><meta-value>9</meta-value></custom-meta><custom-meta><meta-name>issue-online-date-day</meta-name><meta-value>16</meta-value></custom-meta><custom-meta><meta-name>issue-type</meta-name><meta-value>Regular</meta-value></custom-meta><custom-meta><meta-name>article-type</meta-name><meta-value>ReviewPaper</meta-value></custom-meta><custom-meta><meta-name>journal-subject-primary</meta-name><meta-value>Science, Humanities and Social Sciences, multidisciplinary</meta-value></custom-meta><custom-meta><meta-name>journal-subject-secondary</meta-name><meta-value>Science, Humanities and Social Sciences, multidisciplinary</meta-value></custom-meta><custom-meta><meta-name>journal-subject-secondary</meta-name><meta-value>Science, multidisciplinary</meta-value></custom-meta><custom-meta><meta-name>journal-subject-collection</meta-name><meta-value>Science (multidisciplinary)</meta-value></custom-meta><custom-meta><meta-name>open-access</meta-name><meta-value>true</meta-value></custom-meta></custom-meta-group></article-meta></front><body><sec id="Sec1"><title>Main</title><p id="Par3">Two Python array packages existed before NumPy. The Numeric package was developed in the mid-1990s and provided array objects and array-aware functions in Python. It was written in C and linked to standard fast implementations of linear algebra<sup><xref ref-type="bibr" rid="CR3">3</xref>,<xref ref-type="bibr" rid="CR4">4</xref></sup>. One of its earliest uses was to steer C++ applications for inertial confinement fusion research at Lawrence Livermore National Laboratory<sup><xref ref-type="bibr" rid="CR5">5</xref></sup>. To handle large astronomical images coming from the Hubble Space Telescope, a reimplementation of Numeric, called Numarray, added support for structured arrays, flexible indexing, memory mapping, byte-order variants, more efficient memory use, flexible IEEE 754-standard error-handling capabilities, and better type-casting rules<sup><xref ref-type="bibr" rid="CR6">6</xref></sup>. Although Numarray was highly compatible with Numeric, the two packages had enough differences that it divided the community; however, in 2005 NumPy emerged as a ‘best of both worlds’ unification<sup><xref ref-type="bibr" rid="CR7">7</xref></sup>—combining the features of Numarray with the small-array performance of Numeric and its rich C API.</p><p id="Par4">Now, 15 years later, NumPy underpins almost every Python library that does scientific or numerical computation<sup><xref ref-type="bibr" rid="CR8">8</xref>–<xref ref-type="bibr" rid="CR11">11</xref></sup>, including SciPy<sup><xref ref-type="bibr" rid="CR12">12</xref></sup>, Matplotlib<sup><xref ref-type="bibr" rid="CR13">13</xref></sup>, pandas<sup><xref ref-type="bibr" rid="CR14">14</xref></sup>, scikit-learn<sup><xref ref-type="bibr" rid="CR15">15</xref></sup> and scikit-image<sup><xref ref-type="bibr" rid="CR16">16</xref></sup>. NumPy is a community-developed, open-source library, which provides a multidimensional Python array object along with array-aware functions that operate on it. Because of its inherent simplicity, the NumPy array is the de facto exchange format for array data in Python.</p><p id="Par5">NumPy operates on in-memory arrays using the central processing unit (CPU). To utilize modern, specialized storage and hardware, there has been a recent proliferation of Python array packages. Unlike with the Numarray–Numeric divide, it is now much harder for these new libraries to fracture the user community—given how much work is already built on top of NumPy. However, to provide the community with access to new and exploratory technologies, NumPy is transitioning into a central coordinating mechanism that specifies a well defined array programming API and dispatches it, as appropriate, to specialized array implementations.</p></sec><sec id="Sec2"><title>NumPy arrays</title><p id="Par6">The NumPy array is a data structure that efficiently stores and accesses multidimensional arrays<sup><xref ref-type="bibr" rid="CR17">17</xref></sup> (also known as tensors), and enables a wide variety of scientific computation. It consists of a pointer to memory, along with metadata used to interpret the data stored there, notably ‘data type’, ‘shape’ and ‘strides’ (Fig. <xref rid="Fig1" ref-type="fig">1a</xref>).<fig id="Fig1"><label>Fig. 1</label><caption xml:lang="en"><title>The NumPy array incorporates several fundamental array concepts.</title><p><bold>a</bold>, The NumPy array data structure and its associated metadata fields. <bold>b</bold>, Indexing an array with slices and steps. These operations return a ‘view’ of the original data. <bold>c</bold>, Indexing an array with masks, scalar coordinates or other arrays, so that it returns a ‘copy’ of the original data. In the bottom example, an array is indexed with other arrays; this broadcasts the indexing arguments before performing the lookup. <bold>d</bold>, Vectorization efficiently applies operations to groups of elements. <bold>e</bold>, Broadcasting in the multiplication of two-dimensional arrays. <bold>f</bold>, Reduction operations act along one or more axes. In this example, an array is summed along select axes to produce a vector, or along two axes consecutively to produce a scalar. <bold>g</bold>, Example NumPy code, illustrating some of these concepts.</p></caption><p><graphic specific-use="HTML" mime-subtype="PNG" xlink:href="MediaObjects/41586_2020_2649_Fig1_HTML.png"/></p></fig></p><p id="Par7">The data type describes the nature of elements stored in an array. An array has a single data type, and each element of an array occupies the same number of bytes in memory. Examples of data types include real and complex numbers (of lower and higher precision), strings, timestamps and pointers to Python objects.</p><p id="Par8">The shape of an array determines the number of elements along each axis, and the number of axes is the dimensionality of the array. For example, a vector of numbers can be stored as a one-dimensional array of shape <italic>N</italic>, whereas colour videos are four-dimensional arrays of shape (<italic>T</italic>, <italic>M</italic>, <italic>N</italic>, 3).</p><p id="Par9">Strides are necessary to interpret computer memory, which stores elements linearly, as multidimensional arrays. They describe the number of bytes to move forward in memory to jump from row to row, column to column, and so forth. Consider, for example, a two-dimensional array of floating-point numbers with shape (4, 3), where each element occupies 8 bytes in memory. To move between consecutive columns, we need to jump forward 8 bytes in memory, and to access the next row, 3 × 8 = 24 bytes. The strides of that array are therefore (24, 8). NumPy can store arrays in either C or Fortran memory order, iterating first over either rows or columns. This allows external libraries written in those languages to access NumPy array data in memory directly.</p><p id="Par10">Users interact with NumPy arrays using ‘indexing’ (to access subarrays or individual elements), ‘operators’ (for example, +, − and × for vectorized operations and @ for matrix multiplication), as well as ‘array-aware functions’; together, these provide an easily readable, expressive, high-level API for array programming while NumPy deals with the underlying mechanics of making operations fast.</p><p id="Par11">Indexing an array returns single elements, subarrays or elements that satisfy a specific condition (Fig. <xref rid="Fig1" ref-type="fig">1b</xref>). Arrays can even be indexed using other arrays (Fig. <xref rid="Fig1" ref-type="fig">1c</xref>). Wherever possible, indexing that retrieves a subarray returns a ‘view’ on the original array such that data are shared between the two arrays. This provides a powerful way to operate on subsets of array data while limiting memory usage.</p><p id="Par12">To complement the array syntax, NumPy includes functions that perform vectorized calculations on arrays, including arithmetic, statistics and trigonometry (Fig. <xref rid="Fig1" ref-type="fig">1d</xref>). Vectorization—operating on entire arrays rather than their individual elements—is essential to array programming. This means that operations that would take many tens of lines to express in languages such as C can often be implemented as a single, clear Python expression. This results in concise code and frees users to focus on the details of their analysis, while NumPy handles looping over array elements near-optimally—for example, taking strides into consideration to best utilize the computer’s fast cache memory.</p><p id="Par13">When performing a vectorized operation (such as addition) on two arrays with the same shape, it is clear what should happen. Through ‘broadcasting’ NumPy allows the dimensions to differ, and produces results that appeal to intuition. A trivial example is the addition of a scalar value to an array, but broadcasting also generalizes to more complex examples such as scaling each column of an array or generating a grid of coordinates. In broadcasting, one or both arrays are virtually duplicated (that is, without copying any data in memory), so that the shapes of the operands match (Fig. <xref rid="Fig1" ref-type="fig">1d</xref>). Broadcasting is also applied when an array is indexed using arrays of indices (Fig. <xref rid="Fig1" ref-type="fig">1c</xref>).</p><p id="Par14">Other array-aware functions, such as sum, mean and maximum, perform element-by-element ‘reductions’, aggregating results across one, multiple or all axes of a single array. For example, summing an <italic>n</italic>-dimensional array over <italic>d</italic> axes results in an array of dimension <italic>n</italic> − <italic>d</italic> (Fig. <xref rid="Fig1" ref-type="fig">1f</xref>).</p><p id="Par15">NumPy also includes array-aware functions for creating, reshaping, concatenating and padding arrays; searching, sorting and counting data; and reading and writing files. It provides extensive support for generating pseudorandom numbers, includes an assortment of probability distributions, and performs accelerated linear algebra, using one of several backends such as OpenBLAS<sup><xref ref-type="bibr" rid="CR18">18</xref>,<xref ref-type="bibr" rid="CR19">19</xref></sup> or Intel MKL optimized for the CPUs at hand (see Supplementary Methods for more details).</p><p id="Par16">Altogether, the combination of a simple in-memory array representation, a syntax that closely mimics mathematics, and a variety of array-aware utility functions forms a productive and powerfully expressive array programming language.</p></sec><sec id="Sec3"><title>Scientific Python ecosystem</title><p id="Par17">Python is an open-source, general-purpose interpreted programming language well suited to standard programming tasks such as cleaning data, interacting with web resources and parsing text. Adding fast array operations and linear algebra enables scientists to do all their work within a single programming language—one that has the advantage of being famously easy to learn and teach, as witnessed by its adoption as a primary learning language in many universities.</p><p id="Par18">Even though NumPy is not part of Python’s standard library, it benefits from a good relationship with the Python developers. Over the years, the Python language has added new features and special syntax so that NumPy would have a more succinct and easier-to-read array notation. However, because it is not part of the standard library, NumPy is able to dictate its own release policies and development patterns.</p><p id="Par19">SciPy and Matplotlib are tightly coupled with NumPy in terms of history, development and use. SciPy provides fundamental algorithms for scientific computing, including mathematical, scientific and engineering routines. Matplotlib generates publication-ready figures and visualizations. The combination of NumPy, SciPy and Matplotlib, together with an advanced interactive environment such as IPython<sup><xref ref-type="bibr" rid="CR20">20</xref></sup> or Jupyter<sup><xref ref-type="bibr" rid="CR21">21</xref></sup>, provides a solid foundation for array programming in Python. The scientific Python ecosystem (Fig. <xref rid="Fig2" ref-type="fig">2</xref>) builds on top of this foundation to provide several, widely used technique-specific libraries<sup><xref ref-type="bibr" rid="CR15">15</xref>,<xref ref-type="bibr" rid="CR16">16</xref>,<xref ref-type="bibr" rid="CR22">22</xref></sup>, that in turn underlie numerous domain-specific projects<sup><xref ref-type="bibr" rid="CR23">23</xref>–<xref ref-type="bibr" rid="CR28">28</xref></sup>. NumPy, at the base of the ecosystem of array-aware libraries, sets documentation standards, provides array testing infrastructure and adds build support for Fortran and other compilers.<fig id="Fig2"><label>Fig. 2</label><caption xml:lang="en"><title>NumPy is the base of the scientific Python ecosystem.</title><p>Essential libraries and projects that depend on NumPy’s API gain access to new array implementations that support NumPy’s array protocols (Fig. <xref rid="Fig3" ref-type="fig">3</xref>).</p></caption><p><graphic specific-use="HTML" mime-subtype="PNG" xlink:href="MediaObjects/41586_2020_2649_Fig2_HTML.png"/></p></fig></p><p id="Par20">Many research groups have designed large, complex scientific libraries that add application-specific functionality to the ecosystem. For example, the eht-imaging library<sup><xref ref-type="bibr" rid="CR29">29</xref></sup>, developed by the Event Horizon Telescope collaboration for radio interferometry imaging, analysis and simulation, relies on many lower-level components of the scientific Python ecosystem. In particular, the EHT collaboration used this library for the first imaging of a black hole. Within eht-imaging, NumPy arrays are used to store and manipulate numerical data at every step in the processing chain: from raw data through calibration and image reconstruction. SciPy supplies tools for general image-processing tasks such as filtering and image alignment, and scikit-image, an image-processing library that extends SciPy, provides higher-level functionality such as edge filters and Hough transforms. The ‘scipy.optimize’ module performs mathematical optimization. NetworkX<sup><xref ref-type="bibr" rid="CR22">22</xref></sup>, a package for complex network analysis, is used to verify image comparison consistency. Astropy<sup><xref ref-type="bibr" rid="CR23">23</xref>,<xref ref-type="bibr" rid="CR24">24</xref></sup> handles standard astronomical file formats and computes time–coordinate transformations. Matplotlib is used to visualize data and to generate the final image of the black hole.</p><p id="Par21">The interactive environment created by the array programming foundation and the surrounding ecosystem of tools—inside of IPython or Jupyter—is ideally suited to exploratory data analysis. Users can fluidly inspect, manipulate and visualize their data, and rapidly iterate to refine programming statements. These statements are then stitched together into imperative or functional programs, or notebooks containing both computation and narrative. Scientific computing beyond exploratory work is often done in a text editor or an integrated development environment (IDE) such as Spyder. This rich and productive environment has made Python popular for scientific research.</p><p id="Par22">To complement this facility for exploratory work and rapid prototyping, NumPy has developed a culture of using time-tested software engineering practices to improve collaboration and reduce error<sup><xref ref-type="bibr" rid="CR30">30</xref></sup>. This culture is not only adopted by leaders in the project but also enthusiastically taught to newcomers. The NumPy team was early to adopt distributed revision control and code review to improve collaboration on code, and continuous testing that runs an extensive battery of automated tests for every proposed change to NumPy. The project also has comprehensive, high-quality documentation, integrated with the source code<sup><xref ref-type="bibr" rid="CR31">31</xref>–<xref ref-type="bibr" rid="CR33">33</xref></sup>.</p><p id="Par23">This culture of using best practices for producing reliable scientific software has been adopted by the ecosystem of libraries that build on NumPy. For example, in a recent award given by the Royal Astronomical Society to Astropy, they state: “The Astropy Project has provided hundreds of junior scientists with experience in professional-standard software development practices including use of version control, unit testing, code review and issue tracking procedures. This is a vital skill set for modern researchers that is often missing from formal university education in physics or astronomy”<sup><xref ref-type="bibr" rid="CR34">34</xref></sup>. Community members explicitly work to address this lack of formal education through courses and workshops<sup><xref ref-type="bibr" rid="CR35">35</xref>–<xref ref-type="bibr" rid="CR37">37</xref></sup>.</p><p id="Par24">The recent rapid growth of data science, machine learning and artificial intelligence has further and dramatically boosted the scientific use of Python. Examples of its important applications, such as the eht-imaging library, now exist in almost every discipline in the natural and social sciences. These tools have become the primary software environment in many fields. NumPy and its ecosystem are commonly taught in university courses, boot camps and summer schools, and are the focus of community conferences and workshops worldwide. NumPy and its API have become truly ubiquitous.</p></sec><sec id="Sec4"><title>Array proliferation and interoperability</title><p id="Par25">NumPy provides in-memory, multidimensional, homogeneously typed (that is, single-pointer and strided) arrays on CPUs. It runs on machines ranging from embedded devices to the world’s largest supercomputers, with performance approaching that of compiled languages. For most its existence, NumPy addressed the vast majority of array computation use cases.</p><p id="Par26">However, scientific datasets now routinely exceed the memory capacity of a single machine and may be stored on multiple machines or in the cloud. In addition, the recent need to accelerate deep-learning and artificial intelligence applications has led to the emergence of specialized accelerator hardware, including graphics processing units (GPUs), tensor processing units (TPUs) and field-programmable gate arrays (FPGAs). Owing to its in-memory data model, NumPy is currently unable to directly utilize such storage and specialized hardware. However, both distributed data and also the parallel execution of GPUs, TPUs and FPGAs map well to the paradigm of array programming: therefore leading to a gap between available modern hardware architectures and the tools necessary to leverage their computational power.</p><p id="Par27">The community’s efforts to fill this gap led to a proliferation of new array implementations. For example, each deep-learning framework created its own arrays; the PyTorch<sup><xref ref-type="bibr" rid="CR38">38</xref></sup>, Tensorflow<sup><xref ref-type="bibr" rid="CR39">39</xref></sup>, Apache MXNet<sup><xref ref-type="bibr" rid="CR40">40</xref></sup> and JAX arrays all have the capability to run on CPUs and GPUs in a distributed fashion, using lazy evaluation to allow for additional performance optimizations. SciPy and PyData/Sparse both provide sparse arrays, which typically contain few non-zero values and store only those in memory for efficiency. In addition, there are projects that build on NumPy arrays as data containers, and extend its capabilities. Distributed arrays are made possible that way by Dask, and labelled arrays—referring to dimensions of an array by name rather than by index for clarity, compare x[:, 1] versus x.loc[:, 'time']—by xarray<sup><xref ref-type="bibr" rid="CR41">41</xref></sup>.</p><p id="Par28">Such libraries often mimic the NumPy API, because this lowers the barrier to entry for newcomers and provides the wider community with a stable array programming interface. This, in turn, prevents disruptive schisms such as the divergence between Numeric and Numarray. But exploring new ways of working with arrays is experimental by nature and, in fact, several promising libraries (such as Theano and Caffe) have already ceased development. And each time that a user decides to try a new technology, they must change import statements and ensure that the new library implements all the parts of the NumPy API they currently use.</p><p id="Par29">Ideally, operating on specialized arrays using NumPy functions or semantics would simply work, so that users could write code once, and would then benefit from switching between NumPy arrays, GPU arrays, distributed arrays and so forth as appropriate. To support array operations between external array objects, NumPy therefore added the capability to act as a central coordination mechanism with a well specified API (Fig. <xref rid="Fig2" ref-type="fig">2</xref>).</p><p id="Par30">To facilitate this interoperability, NumPy provides ‘protocols’ (or contracts of operation), that allow for specialized arrays to be passed to NumPy functions (Fig. <xref rid="Fig3" ref-type="fig">3</xref>). NumPy, in turn, dispatches operations to the originating library, as required. Over four hundred of the most popular NumPy functions are supported. The protocols are implemented by widely used libraries such as Dask, CuPy, xarray and PyData/Sparse. Thanks to these developments, users can now, for example, scale their computation from a single machine to distributed systems using Dask. The protocols also compose well, allowing users to redeploy NumPy code at scale on distributed, multi-GPU systems via, for instance, CuPy arrays embedded in Dask arrays. Using NumPy’s high-level API, users can leverage highly parallel code execution on multiple systems with millions of cores, all with minimal code changes<sup><xref ref-type="bibr" rid="CR42">42</xref></sup>.<fig id="Fig3"><label>Fig. 3</label><caption xml:lang="en"><title>NumPy’s API and array protocols expose new arrays to the ecosystem.</title><p>In this example, NumPy’s ‘mean’ function is called on a Dask array. The call succeeds by dispatching to the appropriate library implementation (in this case, Dask) and results in a new Dask array. Compare this code to the example code in Fig. <xref rid="Fig1" ref-type="fig">1g</xref>.</p></caption><p><graphic specific-use="HTML" mime-subtype="PNG" xlink:href="MediaObjects/41586_2020_2649_Fig3_HTML.png"/></p></fig></p><p id="Par31">These array protocols are now a key feature of NumPy, and are expected to only increase in importance. The NumPy developers—many of whom are authors of this Review—iteratively refine and add protocol designs to improve utility and simplify adoption.</p></sec><sec id="Sec5" sec-type="discussion"><title>Discussion</title><p id="Par32">NumPy combines the expressive power of array programming, the performance of C, and the readability, usability and versatility of Python in a mature, well tested, well documented and community-developed library. Libraries in the scientific Python ecosystem provide fast implementations of most important algorithms. Where extreme optimization is warranted, compiled languages can be used, such as Cython<sup><xref ref-type="bibr" rid="CR43">43</xref></sup>, Numba<sup><xref ref-type="bibr" rid="CR44">44</xref></sup> and Pythran<sup><xref ref-type="bibr" rid="CR45">45</xref></sup>; these languages extend Python and transparently accelerate bottlenecks. Owing to NumPy’s simple memory model, it is easy to write low-level, hand-optimized code, usually in C or Fortran, to manipulate NumPy arrays and pass them back to Python. Furthermore, using array protocols, it is possible to utilize the full spectrum of specialized hardware acceleration with minimal changes to existing code.</p><p id="Par33">NumPy was initially developed by students, faculty and researchers to provide an advanced, open-source array programming library for Python, which was free to use and unencumbered by license servers and software protection dongles. There was a sense of building something consequential together for the benefit of many others. Participating in such an endeavour, within a welcoming community of like-minded individuals, held a powerful attraction for many early contributors.</p><p id="Par34">These user–developers frequently had to write code from scratch to solve their own or their colleagues’ problems—often in low-level languages that preceded Python, such as Fortran<sup><xref ref-type="bibr" rid="CR46">46</xref></sup> and C. To them, the advantages of an interactive, high-level array library were evident. The design of this new tool was informed by other powerful interactive programming languages for scientific computing such as Basis<sup><xref ref-type="bibr" rid="CR47">47</xref>–<xref ref-type="bibr" rid="CR50">50</xref></sup>, Yorick<sup><xref ref-type="bibr" rid="CR51">51</xref></sup>, R<sup><xref ref-type="bibr" rid="CR52">52</xref></sup> and APL<sup><xref ref-type="bibr" rid="CR53">53</xref></sup>, as well as commercial languages and environments such as IDL (Interactive Data Language) and MATLAB.</p><p id="Par35">What began as an attempt to add an array object to Python became the foundation of a vibrant ecosystem of tools. Now, a large amount of scientific work depends on NumPy being correct, fast and stable. It is no longer a small community project, but core scientific infrastructure.</p><p id="Par36">The developer culture has matured: although initial development was highly informal, NumPy now has a roadmap and a process for proposing and discussing large changes. The project has formal governance structures and is fiscally sponsored by NumFOCUS, a nonprofit that promotes open practices in research, data and scientific computing. Over the past few years, the project attracted its first funded development, sponsored by the Moore and Sloan Foundations, and received an award as part of the Chan Zuckerberg Initiative’s Essentials of Open Source Software programme. With this funding, the project was (and is) able to have sustained focus over multiple months to implement substantial new features and improvements. That said, the development of NumPy still depends heavily on contributions made by graduate students and researchers in their free time (see Supplementary Methods for more details).</p><p id="Par37">NumPy is no longer merely the foundational array library underlying the scientific Python ecosystem, but it has become the standard API for tensor computation and a central coordinating mechanism between array types and technologies in Python. Work continues to expand on and improve these interoperability features.</p><p id="Par38">Over the next decade, NumPy developers will face several challenges. New devices will be developed, and existing specialized hardware will evolve to meet diminishing returns on Moore’s law. There will be more, and a wider variety of, data science practitioners, a large proportion of whom will use NumPy. The scale of scientific data gathering will continue to increase, with the adoption of devices and instruments such as light-sheet microscopes and the Large Synoptic Survey Telescope (LSST)<sup><xref ref-type="bibr" rid="CR54">54</xref></sup>. New generation languages, interpreters and compilers, such as Rust<sup><xref ref-type="bibr" rid="CR55">55</xref></sup>, Julia<sup><xref ref-type="bibr" rid="CR56">56</xref></sup> and LLVM<sup><xref ref-type="bibr" rid="CR57">57</xref></sup>, will create new concepts and data structures, and determine their viability.</p><p id="Par39">Through the mechanisms described in this Review, NumPy is poised to embrace such a changing landscape, and to continue playing a leading part in interactive scientific computation, although to do so will require sustained funding from government, academia and industry. But, importantly, for NumPy to meet the needs of the next decade of data science, it will also need a new generation of graduate students and community contributors to drive it forward.</p></sec></body><back><ack><title>Acknowledgements</title><p>We thank R. Barnowski, P. Dubois, M. Eickenberg, and P. Greenfield, who suggested text and provided helpful feedback on the manuscript. K.J.M. and S.J.v.d.W. were funded in part by the Gordon and Betty Moore Foundation through grant GBMF3834 and by the Alfred P. Sloan Foundation through grant 2013-10-27 to the University of California, Berkeley. S.J.v.d.W., S.B., M.P. and W.W. were funded in part by the Gordon and Betty Moore Foundation through grant GBMF5447 and by the Alfred P. Sloan Foundation through grant G-2017-9960 to the University of California, Berkeley.</p></ack><sec sec-type="author-contribution"><title>Author contributions</title><p>K.J.M. and S.J.v.d.W. composed the manuscript with input from others. S.B., R.G., K.S., W.W., M.B. and T.R. contributed text. All authors contributed substantial code, documentation and/or expertise to the NumPy project. All authors reviewed the manuscript.</p></sec><sec sec-type="ethics-statement"><sec id="FPar1" sec-type="COI-statement"><title>Competing interests</title><p id="Par41">The authors declare no competing interests.</p></sec></sec><ref-list id="Bib1"><title>References</title><ref-list><ref id="CR1"><label>1.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Abbott</surname><given-names>BP</given-names></name><etal/></person-group><article-title xml:lang="en">Observation of gravitational waves from a binary black hole merger</article-title><source>Phys. Rev. Lett.</source><year>2016</year><volume>116</volume><fpage>061102</fpage><pub-id pub-id-type="bibcode">2016PhRvL.116f1102A</pub-id><pub-id pub-id-type="amsid">3707758</pub-id><pub-id pub-id-type="coi">1:STN:280:DC%2BC28jltVGjug%3D%3D</pub-id><pub-id pub-id-type="doi">10.1103/PhysRevLett.116.061102</pub-id></mixed-citation></ref><ref id="CR2"><label>2.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Chael</surname><given-names>A</given-names></name><etal/></person-group><article-title xml:lang="en">High-resolution linear polarimetric imaging for the Event Horizon Telescope</article-title><source>Astrophys. J.</source><year>2016</year><volume>286</volume><fpage>11</fpage><pub-id pub-id-type="bibcode">2016ApJ...833...11C</pub-id><pub-id pub-id-type="doi">10.3847/0004-637X/829/1/11</pub-id></mixed-citation></ref><ref id="CR3"><label>3.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Dubois</surname><given-names>PF</given-names></name><name><surname>Hinsen</surname><given-names>K</given-names></name><name><surname>Hugunin</surname><given-names>J</given-names></name></person-group><article-title xml:lang="en">Numerical Python</article-title><source>Comput. Phys.</source><year>1996</year><volume>10</volume><fpage>262</fpage><lpage>267</lpage><pub-id pub-id-type="bibcode">1996ComPh..10..262D</pub-id><pub-id pub-id-type="doi">10.1063/1.4822400</pub-id></mixed-citation></ref><ref id="CR4"><label>4.</label><mixed-citation publication-type="other">Ascher, D., Dubois, P. F., Hinsen, K., Hugunin, J. &amp; Oliphant, T. E. <italic>An Open Source Project: Numerical Python</italic> (Lawrence Livermore National Laboratory, 2001).</mixed-citation></ref><ref id="CR5"><label>5.</label><mixed-citation publication-type="other">Yang, T.-Y., Furnish, G. &amp; Dubois, P. F. Steering object-oriented scientific computations. In <italic>Proc. TOOLS USA 97. Intl Conf. Technology of Object Oriented Systems and Languages</italic> (eds Ege, R., Singh, M. &amp; Meyer, B.) 112–119 (IEEE, 1997).</mixed-citation></ref><ref id="CR6"><label>6.</label><mixed-citation publication-type="other">Greenfield, P., Miller, J. T., Hsu, J. &amp; White, R. L. numarray: a new scientific array package for Python. In <italic>PyCon DC 2003</italic><ext-link xlink:href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.112.9899" ext-link-type="url">http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.112.9899</ext-link> (2003).</mixed-citation></ref><ref id="CR7"><label>7.</label><mixed-citation publication-type="other">Oliphant, T. E. <italic>Guide to NumPy</italic> 1st edn (Trelgol Publishing, 2006).</mixed-citation></ref><ref id="CR8"><label>8.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Dubois</surname><given-names>PF</given-names></name></person-group><article-title xml:lang="en">Python: batteries included</article-title><source>Comput. Sci. Eng.</source><year>2007</year><volume>9</volume><fpage>7</fpage><lpage>9</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2007.51</pub-id></mixed-citation></ref><ref id="CR9"><label>9.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Oliphant</surname><given-names>TE</given-names></name></person-group><article-title xml:lang="en">Python for scientific computing</article-title><source>Comput. Sci. Eng.</source><year>2007</year><volume>9</volume><fpage>10</fpage><lpage>20</lpage><pub-id pub-id-type="coi">1:CAS:528:DC%2BD2sXltVWiurw%3D</pub-id><pub-id pub-id-type="doi">10.1109/MCSE.2007.58</pub-id></mixed-citation></ref><ref id="CR10"><label>10.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Millman</surname><given-names>KJ</given-names></name><name><surname>Aivazis</surname><given-names>M</given-names></name></person-group><article-title xml:lang="en">Python for scientists and engineers</article-title><source>Comput. Sci. Eng.</source><year>2011</year><volume>13</volume><fpage>9</fpage><lpage>12</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2011.36</pub-id></mixed-citation></ref><ref id="CR11"><label>11.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Pérez</surname><given-names>F</given-names></name><name><surname>Granger</surname><given-names>BE</given-names></name><name><surname>Hunter</surname><given-names>JD</given-names></name></person-group><article-title xml:lang="en">Python: an ecosystem for scientific computing</article-title><source>Comput. Sci. Eng.</source><year>2011</year><volume>13</volume><fpage>13</fpage><lpage>21</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2010.119</pub-id><comment><bold>Explains why the scientific Python ecosystem is a highly productive environment for research</bold></comment></mixed-citation></ref><ref id="CR12"><label>12.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Virtanen</surname><given-names>P</given-names></name><etal/></person-group><article-title xml:lang="en">SciPy 1.0—fundamental algorithms for scientific computing in Python</article-title><source>Nat. Methods</source><year>2020</year><volume>17</volume><fpage>261</fpage><lpage>272</lpage><pub-id pub-id-type="coi">1:CAS:528:DC%2BB3cXislCjuro%3D</pub-id><pub-id pub-id-type="doi">10.1038/s41592-019-0686-2</pub-id><comment>correction <bold>17</bold>, 352 (2020). <bold>Introduces the SciPy library and includes a more detailed history of NumPy and SciPy</bold></comment></mixed-citation></ref><ref id="CR13"><label>13.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Hunter</surname><given-names>JD</given-names></name></person-group><article-title xml:lang="en">Matplotlib: a 2D graphics environment</article-title><source>Comput. Sci. Eng.</source><year>2007</year><volume>9</volume><fpage>90</fpage><lpage>95</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2007.55</pub-id></mixed-citation></ref><ref id="CR14"><label>14.</label><mixed-citation publication-type="other">McKinney, W. Data structures for statistical computing in Python. In <italic>Proc. 9th Python in Science Conf</italic>. (eds van der Walt, S. &amp; Millman, K. J.) 56–61 (2010).</mixed-citation></ref><ref id="CR15"><label>15.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Pedregosa</surname><given-names>F</given-names></name><etal/></person-group><article-title xml:lang="en">Scikit-learn: machine learning in Python</article-title><source>J. Mach. Learn. Res.</source><year>2011</year><volume>12</volume><fpage>2825</fpage><lpage>2830</lpage><pub-id pub-id-type="amsid">2854348</pub-id><pub-id pub-id-type="zbl">1280.68189</pub-id></mixed-citation></ref><ref id="CR16"><label>16.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>van der Walt</surname><given-names>S</given-names></name><etal/></person-group><article-title xml:lang="en">scikit-image: image processing in Python</article-title><source>PeerJ</source><year>2014</year><volume>2</volume><fpage>e453</fpage><pub-id pub-id-type="doi">10.7717/peerj.453</pub-id></mixed-citation></ref><ref id="CR17"><label>17.</label><mixed-citation publication-type="other">van der Walt, S., Colbert, S. C. &amp; Varoquaux, G. The NumPy array: a structure for efficient numerical computation. <italic>Comput. Sci. Eng</italic>. <bold>13</bold>, 22–30 (2011). <bold>Discusses the NumPy array data structure with a focus on how it enables efficient computation</bold>.</mixed-citation></ref><ref id="CR18"><label>18.</label><mixed-citation publication-type="other">Wang, Q., Zhang, X., Zhang, Y. &amp; Yi, Q. AUGEM: automatically generate high performance dense linear algebra kernels on x86 CPUs. In <italic>SC’13: Proc. Intl Conf. High Performance Computing, Networking, Storage and Analysis</italic> 25 (IEEE, 2013).</mixed-citation></ref><ref id="CR19"><label>19.</label><mixed-citation publication-type="other">Xianyi, Z., Qian, W. &amp; Yunquan, Z. Model-driven level 3 BLAS performance optimization on Loongson 3A processor. In <italic>2012 IEEE 18th Intl Conf. Parallel and Distributed Systems</italic> 684–691 (IEEE, 2012).</mixed-citation></ref><ref id="CR20"><label>20.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Pérez</surname><given-names>F</given-names></name><name><surname>Granger</surname><given-names>BE</given-names></name></person-group><article-title xml:lang="en">IPython: a system for interactive scientific computing</article-title><source>Comput. Sci. Eng.</source><year>2007</year><volume>9</volume><fpage>21</fpage><lpage>29</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2007.53</pub-id></mixed-citation></ref><ref id="CR21"><label>21.</label><mixed-citation publication-type="other">Kluyver, T. et al. Jupyter Notebooks—a publishing format for reproducible computational workflows. In <italic>Positioning and Power in Academic Publishing: Players, Agents and Agendas</italic> (eds Loizides, F. &amp; Schmidt, B.) 87–90 (IOS Press, 2016).</mixed-citation></ref><ref id="CR22"><label>22.</label><mixed-citation publication-type="other">Hagberg, A. A., Schult, D. A. &amp; Swart, P. J. Exploring network structure, dynamics, and function using NetworkX. In <italic>Proc. 7th Python in Science Conf</italic>. (eds Varoquaux, G., Vaught, T. &amp; Millman, K. J.) 11–15 (2008).</mixed-citation></ref><ref id="CR23"><label>23.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Astropy Collaboration</surname></name><etal/></person-group><article-title xml:lang="en">Astropy: a community Python package for astronomy</article-title><source>Astron. Astrophys.</source><year>2013</year><volume>558</volume><fpage>A33</fpage><pub-id pub-id-type="doi">10.1051/0004-6361/201322068</pub-id></mixed-citation></ref><ref id="CR24"><label>24.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Price-Whelan</surname><given-names>AM</given-names></name><etal/></person-group><article-title xml:lang="en">The Astropy Project: building an open-science project and status of the v2.0 core package</article-title><source>Astron. J.</source><year>2018</year><volume>156</volume><fpage>123</fpage><pub-id pub-id-type="bibcode">2018AJ....156..123A</pub-id><pub-id pub-id-type="doi">10.3847/1538-3881/aac387</pub-id></mixed-citation></ref><ref id="CR25"><label>25.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Cock</surname><given-names>PJ</given-names></name><etal/></person-group><article-title xml:lang="en">Biopython: freely available Python tools for computational molecular biology and bioinformatics</article-title><source>Bioinformatics</source><year>2009</year><volume>25</volume><fpage>1422</fpage><lpage>1423</lpage><pub-id pub-id-type="coi">1:CAS:528:DC%2BD1MXmtFeqt74%3D</pub-id><pub-id pub-id-type="doi">10.1093/bioinformatics/btp163</pub-id></mixed-citation></ref><ref id="CR26"><label>26.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Millman</surname><given-names>KJ</given-names></name><name><surname>Brett</surname><given-names>M</given-names></name></person-group><article-title xml:lang="en">Analysis of functional magnetic resonance imaging in Python</article-title><source>Comput. Sci. Eng.</source><year>2007</year><volume>9</volume><fpage>52</fpage><lpage>55</lpage><pub-id pub-id-type="coi">1:CAS:528:DC%2BD2sXltVWiurs%3D</pub-id><pub-id pub-id-type="doi">10.1109/MCSE.2007.46</pub-id></mixed-citation></ref><ref id="CR27"><label>27.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><collab>The SunPy Community et al.</collab></person-group><article-title xml:lang="en">SunPy—Python for solar physics</article-title><source>Comput. Sci. Discov.</source><year>2015</year><volume>8</volume><fpage>014009</fpage><pub-id pub-id-type="doi">10.1088/1749-4699/8/1/014009</pub-id></mixed-citation></ref><ref id="CR28"><label>28.</label><mixed-citation publication-type="other">Hamman, J., Rocklin, M. &amp; Abernathy, R. Pangeo: a big-data ecosystem for scalable Earth system science. In <italic>EGU General Assembly Conf. Abstracts</italic> 12146 (2018).</mixed-citation></ref><ref id="CR29"><label>29.</label><mixed-citation publication-type="other">Chael, A. A. et al. ehtim: imaging, analysis, and simulation software for radio interferometry. <italic>Astrophysics Source Code Library</italic><ext-link xlink:href="https://ascl.net/1904.004" ext-link-type="url">https://ascl.net/1904.004</ext-link> (2019).</mixed-citation></ref><ref id="CR30"><label>30.</label><mixed-citation publication-type="other">Millman, K. J. &amp; Pérez, F. Developing open source scientific practice. In <italic>Implementing Reproducible Research</italic> (eds Stodden, V., Leisch, F. &amp; Peng, R. D.) 149–183 (CRC Press, 2014). <bold>Describes the software engineering practices embraced by the NumPy and SciPy communities with a focus on how these practices improve research</bold>.</mixed-citation></ref><ref id="CR31"><label>31.</label><mixed-citation publication-type="other">van der Walt, S. The SciPy Documentation Project (technical overview). In <italic>Proc. 7th Python in Science Conf. (SciPy 2008)</italic> (eds Varoquaux, G., Vaught, T. &amp; Millman, K. J.) 27–28 (2008).</mixed-citation></ref><ref id="CR32"><label>32.</label><mixed-citation publication-type="other">Harrington, J. The SciPy Documentation Project. In <italic>Proc. 7th Python in Science Conference (SciPy 2008)</italic> (eds Varoquaux, G., Vaught, T. &amp; Millman, K. J.) 33–35 (2008).</mixed-citation></ref><ref id="CR33"><label>33.</label><mixed-citation publication-type="other">Harrington, J. &amp; Goldsmith, D. Progress report: NumPy and SciPy documentation in 2009. In <italic>Proc. 8th Python in Science Conf. (SciPy 2009)</italic> (eds Varoquaux, G., van der Walt, S. &amp; Millman, K. J.) 84–87 (2009).</mixed-citation></ref><ref id="CR34"><label>34.</label><mixed-citation publication-type="other">Royal Astronomical Society <italic>Report of the RAS ‘A’ Awards Committee 2020: Astropy Project: 2020 Group Achievement Award (A)</italic><ext-link xlink:href="https://ras.ac.uk/sites/default/files/2020-01/Group%20Award%20-%20Astropy.pdf" ext-link-type="url">https://ras.ac.uk/sites/default/files/2020-01/Group%20Award%20-%20Astropy.pdf</ext-link> (2020).</mixed-citation></ref><ref id="CR35"><label>35.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Wilson</surname><given-names>G</given-names></name></person-group><article-title xml:lang="en">Software carpentry: getting scientists to write better code by making them more productive</article-title><source>Comput. Sci. Eng.</source><year>2006</year><volume>8</volume><fpage>66</fpage><lpage>69</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2006.122</pub-id></mixed-citation></ref><ref id="CR36"><label>36.</label><mixed-citation publication-type="other">Hannay, J. E. et al. How do scientists develop and use scientific software? In <italic>Proc. 2009 ICSE Workshop on Software Engineering for Computational Science and Engineering</italic> 1–8 (IEEE, 2009).</mixed-citation></ref><ref id="CR37"><label>37.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Millman</surname><given-names>KJ</given-names></name><name><surname>Brett</surname><given-names>M</given-names></name><name><surname>Barnowski</surname><given-names>R</given-names></name><name><surname>Poline</surname><given-names>J-B</given-names></name></person-group><article-title xml:lang="en">Teaching computational reproducibility for neuroimaging</article-title><source>Front. Neurosci.</source><year>2018</year><volume>12</volume><fpage>727</fpage><pub-id pub-id-type="doi">10.3389/fnins.2018.00727</pub-id></mixed-citation></ref><ref id="CR38"><label>38.</label><mixed-citation publication-type="other">Paszke, A. et al. Pytorch: an imperative style, high-performance deep learning library. In <italic>Advances in Neural Information Processing Systems 32</italic> (eds Wallach, H. et al.) 8024–8035 (Neural Information Processing Systems, 2019).</mixed-citation></ref><ref id="CR39"><label>39.</label><mixed-citation publication-type="other">Abadi, M. et al. TensorFlow: a system for large-scale machine learning. In <italic>OSDI’16: Proc. 12th USENIX Conf. Operating Systems Design and Implementation</italic> (chairs Keeton, K. &amp; Roscoe, T.) 265–283 (USENIX Association, 2016).</mixed-citation></ref><ref id="CR40"><label>40.</label><mixed-citation publication-type="other">Chen, T. et al. MXNet: a flexible and efficient machine learning library for heterogeneous distributed systems. Preprint at <ext-link xlink:href="http://www.arxiv.org/abs/1512.01274" ext-link-type="url">http://www.arxiv.org/abs/1512.01274</ext-link> (2015).</mixed-citation></ref><ref id="CR41"><label>41.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Hoyer</surname><given-names>S</given-names></name><name><surname>Hamman</surname><given-names>J</given-names></name></person-group><article-title xml:lang="en">xarray: N–D labeled arrays and datasets in Python</article-title><source>J. Open Res. Softw.</source><year>2017</year><volume>5</volume><fpage>10</fpage><pub-id pub-id-type="doi">10.5334/jors.148</pub-id></mixed-citation></ref><ref id="CR42"><label>42.</label><mixed-citation publication-type="other">Entschev, P. Distributed multi-GPU computing with Dask, CuPy and RAPIDS. In<italic> EuroPython 2019</italic><ext-link xlink:href="https://ep2019.europython.eu/media/conference/slides/fX8dJsD-distributed-multi-gpu-computing-with-dask-cupy-and-rapids.pdf" ext-link-type="url">https://ep2019.europython.eu/media/conference/slides/fX8dJsD-distributed-multi-gpu-computing-with-dask-cupy-and-rapids.pdf</ext-link> (2019).</mixed-citation></ref><ref id="CR43"><label>43.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Behnel</surname><given-names>S</given-names></name><etal/></person-group><article-title xml:lang="en">Cython: the best of both worlds</article-title><source>Comput. Sci. Eng.</source><year>2011</year><volume>13</volume><fpage>31</fpage><lpage>39</lpage><pub-id pub-id-type="doi">10.1109/MCSE.2010.118</pub-id></mixed-citation></ref><ref id="CR44"><label>44.</label><mixed-citation publication-type="other">Lam, S. K., Pitrou, A. &amp; Seibert, S. Numba: a LLVM-based Python JIT compiler. In <italic>Proc. Second Workshop on the LLVM Compiler Infrastructure in HPC, LLVM ’15</italic> 7:1–7:6 (ACM, 2015).</mixed-citation></ref><ref id="CR45"><label>45.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Guelton</surname><given-names>S</given-names></name><etal/></person-group><article-title xml:lang="en">Pythran: enabling static optimization of scientific Python programs</article-title><source>Comput. Sci. Discov.</source><year>2015</year><volume>8</volume><fpage>014001</fpage><pub-id pub-id-type="doi">10.1088/1749-4680/8/1/014001</pub-id></mixed-citation></ref><ref id="CR46"><label>46.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Dongarra</surname><given-names>J</given-names></name><name><surname>Golub</surname><given-names>GH</given-names></name><name><surname>Grosse</surname><given-names>E</given-names></name><name><surname>Moler</surname><given-names>C</given-names></name><name><surname>Moore</surname><given-names>K</given-names></name></person-group><article-title xml:lang="en">Netlib and NA-Net: building a scientific computing community</article-title><source>IEEE Ann. Hist. Comput.</source><year>2008</year><volume>30</volume><fpage>30</fpage><lpage>41</lpage><pub-id pub-id-type="amsid">2432392</pub-id><pub-id pub-id-type="doi">10.1109/MAHC.2008.29</pub-id></mixed-citation></ref><ref id="CR47"><label>47.</label><mixed-citation publication-type="other">Barrett, K. A., Chiu, Y. H., Painter, J. F., Motteler, Z. C. &amp; Dubois, P. F. <italic>Basis System, Part I: Running a Basis Program—A Tutorial for Beginners</italic> UCRL-MA-118543, Vol. 1 (Lawrence Livermore National Laboratory 1995).</mixed-citation></ref><ref id="CR48"><label>48.</label><mixed-citation publication-type="other">Dubois, P. F. &amp; Motteler, Z. <italic>Basis System, Part II: Basis Language Reference Manual</italic> UCRL-MA-118543, Vol. 2 (Lawrence Livermore National Laboratory, 1995).</mixed-citation></ref><ref id="CR49"><label>49.</label><mixed-citation publication-type="other">Chiu, Y. H. &amp; Dubois, P. F. <italic>Basis System, Part III: EZN User Manual</italic> UCRL-MA-118543, Vol. 3 (Lawrence Livermore National Laboratory, 1995).</mixed-citation></ref><ref id="CR50"><label>50.</label><mixed-citation publication-type="other">Chiu, Y. H. &amp; Dubois, P. F. <italic>Basis System, Part IV: EZD User Manual</italic> UCRL-MA-118543, Vol. 4 (Lawrence Livermore National Laboratory, 1995).</mixed-citation></ref><ref id="CR51"><label>51.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Munro</surname><given-names>DH</given-names></name><name><surname>Dubois</surname><given-names>PF</given-names></name></person-group><article-title xml:lang="en">Using the Yorick interpreted language</article-title><source>Comput. Phys.</source><year>1995</year><volume>9</volume><fpage>609</fpage><lpage>615</lpage><pub-id pub-id-type="bibcode">1995ComPh...9..609M</pub-id><pub-id pub-id-type="doi">10.1063/1.4823451</pub-id></mixed-citation></ref><ref id="CR52"><label>52.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Ihaka</surname><given-names>R</given-names></name><name><surname>Gentleman</surname><given-names>R</given-names></name></person-group><article-title xml:lang="en">R: a language for data analysis and graphics</article-title><source>J. Comput. Graph. Stat.</source><year>1996</year><volume>5</volume><fpage>299</fpage><lpage>314</lpage></mixed-citation></ref><ref id="CR53"><label>53.</label><mixed-citation publication-type="other">Iverson, K. E. A programming language. In <italic>Proc. 1962 Spring Joint Computer Conf</italic>. 345–351 (1962).</mixed-citation></ref><ref id="CR54"><label>54.</label><mixed-citation publication-type="other">Jenness, T. et al. LSST data management software development practices and tools. In <italic>Proc. SPIE 10707, Software and Cyberinfrastructure for Astronomy V</italic> 1070709 (SPIE and International Society for Optics and Photonics, 2018).</mixed-citation></ref><ref id="CR55"><label>55.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Matsakis</surname><given-names>ND</given-names></name><name><surname>Klock</surname><given-names>FS</given-names></name></person-group><article-title xml:lang="en">The Rust language</article-title><source>Ada Letters</source><year>2014</year><volume>34</volume><fpage>103</fpage><lpage>104</lpage><pub-id pub-id-type="doi">10.1145/2692956.2663188</pub-id></mixed-citation></ref><ref id="CR56"><label>56.</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Bezanson</surname><given-names>J</given-names></name><name><surname>Edelman</surname><given-names>A</given-names></name><name><surname>Karpinski</surname><given-names>S</given-names></name><name><surname>Shah</surname><given-names>VB</given-names></name></person-group><article-title xml:lang="en">Julia: a fresh approach to numerical computing</article-title><source>SIAM Rev.</source><year>2017</year><volume>59</volume><fpage>65</fpage><lpage>98</lpage><pub-id pub-id-type="amsid">3605826</pub-id><pub-id pub-id-type="doi">10.1137/141000671</pub-id></mixed-citation></ref><ref id="CR57"><label>57.</label><mixed-citation publication-type="other">Lattner, C. &amp; Adve, V. LLVM: a compilation framework for lifelong program analysis and transformation. In <italic>Proc. 2004 Intl Symp. Code Generation and Optimization (CGO’04)</italic> 75–88 (IEEE, 2004).</mixed-citation></ref></ref-list></ref-list><app-group><app id="App1"><sec id="Sec7"><title>Supplementary information</title><p id="Par42"><supplementary-material content-type="local-data" id="MOESM1" xlink:title="Supplementary information"><media xlink:href="MediaObjects/41586_2020_2649_MOESM1_ESM.pdf" mimetype="application" mime-subtype="pdf"><caption xml:lang="en"><p>This file contains Supplementary Methods, including Supplementary Figure 1 and additional references.</p></caption></media></supplementary-material></p></sec></app></app-group><notes notes-type="ESMHint"><title>Supplementary information</title><p>is available for this paper at <ext-link xlink:href="https://doi.org/10.1038/s41586-020-2649-2" ext-link-type="doi">https://doi.org/10.1038/s41586-020-2649-2</ext-link>.</p></notes><notes notes-type="Misc"><p><bold>Peer review information</bold><italic>Nature</italic> thanks Edouard Duchesnay, Alan Edelman and the other, anonymous, reviewer(s) for their contribution to the peer review of this work.</p></notes><notes notes-type="Misc"><p><bold>Publisher’s note</bold> Springer Nature remains neutral with regard to jurisdictional claims in published maps and institutional affiliations.</p></notes></back></article>