
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "examples_generated/python/02_numeric-arrays.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_examples_generated_python_02_numeric-arrays.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_examples_generated_python_02_numeric-arrays.py:

.. _numpy:

========================
Numeric arrays in Python
========================

Examples demonstrating NumPy usage in ASE documentation.

Links to NumPy's webpage:

* `Numpy and Scipy Documentation`_
* `Numpy user guide <https://docs.scipy.org/doc/numpy/user/index.html>`_


.. _Numpy and Scipy Documentation: https://docs.scipy.org/doc/

ASE makes heavy use of an extension to Python called NumPy.  The
NumPy module defines an ``ndarray`` type that can hold large arrays of
uniform multidimensional numeric data.  An array is similar to a
``list`` or a ``tuple``, but it is a lot more powerful and efficient.

Some examples from everyday ASE-life here ...

.. GENERATED FROM PYTHON SOURCE LINES 24-34

.. code-block:: Python


    import numpy as np

    a = np.zeros((3, 2))
    a[:, 1] = 1.0
    a[1] = 2.0
    print(a)
    print(a.shape)
    print(a.ndim)





.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    [[0. 1.]
     [2. 2.]
     [0. 1.]]
    (3, 2)
    2




.. GENERATED FROM PYTHON SOURCE LINES 35-36

The conventions of numpy's linear algebra package:

.. GENERATED FROM PYTHON SOURCE LINES 36-71

.. code-block:: Python


    # --- Basic array example ---
    a = np.zeros((3, 2))
    a[:, 1] = 1.0
    a[1] = 2.0
    print('Array a:\n', a)
    print('Shape:', a.shape)
    print('Number of dimensions:', a.ndim)

    # --- Linear algebra example ---
    # Make a random Hermitian matrix
    H = np.random.rand(6, 6) + 1.0j * np.random.rand(6, 6)
    H = H + H.T.conj()

    # Eigenvalues and eigenvectors
    eps, U = np.linalg.eigh(H)

    # Sort eigenvalues and corresponding eigenvectors
    sorted_indices = eps.real.argsort()
    eps = eps[sorted_indices]
    U = U[:, sorted_indices]

    # Verify diagonalization
    print(
        'Check diagonalization:\n', np.dot(np.dot(U.T.conj(), H), U) - np.diag(eps)
    )
    print('All close?', np.allclose(np.dot(np.dot(U.T.conj(), H), U), np.diag(eps)))

    # Check eigenvectors individually
    print(
        'Eigenvector check (one column):',
        np.allclose(np.dot(H, U[:, 3]), eps[3] * U[:, 3]),
    )
    print('Eigenvector check (all):', np.allclose(np.dot(H, U), eps * U))





.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    Array a:
     [[0. 1.]
     [2. 2.]
     [0. 1.]]
    Shape: (3, 2)
    Number of dimensions: 2
    Check diagonalization:
     [[ 2.22044605e-16+1.12757026e-17j -2.01227923e-16+2.22044605e-16j
       9.71445147e-17-3.33066907e-16j -2.77555756e-17-2.49800181e-16j
       1.21430643e-16-2.77555756e-16j  9.71445147e-16-2.22044605e-16j]
     [-3.67761377e-16-3.05311332e-16j -4.44089210e-16-1.13000248e-17j
       2.77555756e-17-2.01227923e-16j -6.93889390e-17-5.55111512e-17j
      -2.35922393e-16+1.04083409e-17j  3.33066907e-16-9.71445147e-17j]
     [ 6.93889390e-17+3.26128013e-16j  2.77555756e-17+1.04083409e-17j
       2.22044605e-16-3.37594368e-17j -1.21430643e-16+6.93889390e-17j
       1.24900090e-16-1.90819582e-17j -1.87350135e-16+7.38992201e-16j]
     [-2.77555756e-17+2.56739074e-16j -1.24900090e-16-1.38777878e-17j
      -1.83880688e-16-1.52655666e-16j -3.33066907e-16-3.40929181e-17j
       8.15320034e-17+6.59194921e-17j  4.71844785e-16+1.11022302e-16j]
     [ 1.96023753e-16-1.38777878e-17j -1.94289029e-16-1.14491749e-16j
       8.32667268e-17-8.32667268e-17j  2.77555756e-17+1.38777878e-17j
       1.33226763e-15-7.56350666e-17j  1.11022302e-15-2.28983499e-16j]
     [ 9.43689571e-16+0.00000000e+00j  4.44089210e-16-5.55111512e-17j
      -2.22044605e-16-8.32667268e-16j  5.55111512e-16-2.22044605e-16j
       1.22124533e-15-5.55111512e-17j  0.00000000e+00-7.32524445e-20j]]
    All close? True
    Eigenvector check (one column): True
    Eigenvector check (all): True




.. GENERATED FROM PYTHON SOURCE LINES 72-85

The rules for multiplying 1D arrays with 2D arrays:

* 1D arrays and treated like shape (1, N) arrays (row vectors).
* left and right multiplications are treated identically.
* A length :math:`m` *row* vector can be multiplied with an :math:`n \times m`
  matrix, producing the same result as if replaced by a matrix with
  :math:`n` copies of the vector as rows.
* A length :math:`n` *column* vector can be multiplied with
  an :math:`n \times m`
  matrix, producing the same result as if replaced by a matrix with
  :math:`m` copies of the vector as columns.

Thus, for the arrays below:

.. GENERATED FROM PYTHON SOURCE LINES 85-93

.. code-block:: Python


    # --- 1D vs 2D multiplication rules ---
    M = np.arange(5 * 6).reshape(5, 6)  # A matrix of shape (5, 6)
    v5 = np.arange(5) + 10  # A vector of length 5
    v51 = v5[:, None]  # Column vector (5, 1)
    v6 = np.arange(6) - 12  # A vector of length 6
    v16 = v6[None, :]  # Row vector (1, 6)








.. GENERATED FROM PYTHON SOURCE LINES 94-101

The following identities hold::

  v6 * M == v16 * M == M * v6 == M * v16 == M * v16.repeat(5, 0)
  v51 * M == M * v51 == M * v51.repeat(6, 1)

The same rules apply for adding and subtracting 1D arrays to
from 2D arrays.

.. GENERATED FROM PYTHON SOURCE LINES 101-106

.. code-block:: Python


    # Identities
    print('v6 * M == M * v6?', np.allclose(v6 * M, M * v6))
    print('v16 * M == M * v16?', np.allclose(v16 * M, M * v16))
    print('v51 * M == M * v51?', np.allclose(v51 * M, M * v51))




.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    v6 * M == M * v6? True
    v16 * M == M * v16? True
    v51 * M == M * v51? True





.. _sphx_glr_download_examples_generated_python_02_numeric-arrays.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: 02_numeric-arrays.ipynb <02_numeric-arrays.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: 02_numeric-arrays.py <02_numeric-arrays.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: 02_numeric-arrays.zip <02_numeric-arrays.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
