.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at

..   http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

.. _numpy_interop:

NumPy Integration
=================

PyArrow allows converting back and forth from
`NumPy <https://www.numpy.org/>`_ arrays to Arrow :ref:`Arrays <data.array>`.

NumPy to Arrow
--------------

To convert a NumPy array to Arrow, one can simply call the :func:`pyarrow.array`
factory function.

.. code-block:: python

   >>> import numpy as np
   >>> import pyarrow as pa
   >>> data = np.arange(10, dtype='int16')
   >>> arr = pa.array(data)
   >>> arr
   <pyarrow.lib.Int16Array object at ...>
   [
     0,
     1,
     2,
     3,
     4,
     5,
     6,
     7,
     8,
     9
   ]

Converting from NumPy supports a wide range of input dtypes, including
structured dtypes or strings.

Arrow to NumPy
--------------

In the reverse direction, it is possible to produce a view of an Arrow Array
for use with NumPy using the :meth:`~pyarrow.Array.to_numpy` method.
This is limited to primitive types for which NumPy has the same physical
representation as Arrow, and assuming the Arrow data has no nulls.

.. code-block:: python

   >>> import numpy as np
   >>> import pyarrow as pa
   >>> arr = pa.array([4, 5, 6], type=pa.int32())
   >>> view = arr.to_numpy()
   >>> view
   array([4, 5, 6], dtype=int32)

For more complex data types, you have to use the :meth:`~pyarrow.Array.to_pandas`
method (which will construct a Numpy array with Pandas semantics for, e.g.,
representation of null values).
