indice < linguaggio_python

numpy

https://numpy.org/doc/stable/

Il python (classico) dispone di oggetti array.array (monodimensionali)

numpy permette di usare un nuovo tipo di array

 numpy.ndarray 
Vediamo alcuni esempi per definire un array
1.py
import numpy as np
a = [[ 1., 0., 0.], [ 0., 1., 2.]]
b = np.array([1.2, 3.5, 5.1])
c = np.array( [ [1.0,2.0], [3.0,4.0] ], dtype=complex ) # oppure int32
d = np.zeros((3, 4))
e = np.ones((3, 4))
del e    # libera la memoria

Questa istruzione preleva solo alcuni valori, tutti e tre della seconda colonna.

c[0:2, 1]
c[:,1]     # equivalente

(Per una matrice 2D, quando si richiama un elemento, è del tipo nome[riga,colonna])

Iterazione

usando un indice si stampano intere righe alla volta

  >>> for riga in c:
  ...     print(row)

usando flat si stampano i singoli elementi

  >>> for elemento in c.flat:
  ...     print(element)
Esempio in cui si vuole valutare una funzione
2.py
from numpy import pi
x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
f = np.sin(x)
b = np.fromfunction(f,(100,0),dtype=int)
y,x = np.ogrid[ -1.4:1.4:h*1j, -2:0.8:w*1j ]

Esempio di operatori

matrix product

Scopriamo che è semplice fare le operazioni sui singoli elementi (potenze)

  >>> b = np.array([1.2, 3.5, 5.1])
  >>> b**2
  array([ 1.44, 12.25, 26.01])
Prodotto vettoriale o cross product

Di solito si moltiplicano due array 1 D e si ottiene un terzo array 1 D, ortogonale.

  numpy.cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None)
Prodotto scalare o dot product

Ha un comportamento diverso, a seconda dei fattori utilizzati

   fare un esempio....

Quando gli array sono 2D è preferibile usare @

  >>> d @ e
operazioni scalari
  b.sum()         # somma tutti gli elementi
  b.sum(axis=0)   # somma in colonna
  b.sum(axis=1)   # somma in righe
Randomizzare

Anche numpy ha il proprio generatore di numeri causali

4.py
  import numpy.random as np_r
  rng = np_r.default_rng()
  vals = rng.standard_normal(10)
  more_vals = rng.standard_normal(10)
Copia e vista

Non esistono puntatori, ma si usano!

  >>> a = np.array([2,3,4])
  >>> b = a                # b punta ad a, esiste un solo array
  >>> b is a
  True
  >>> print(id(a))
  >>> print(id(b))
  >>> c=a.view() # le viste sono una copia, con id diverso
  >>> c = a[:, :] # COPIA cioe' crea una view!

Modificando i dati di A, si modifica anche C! Modificando i dati di C, si modifica anche A! Modificando gli attributi (flag) di C NON si modificano i parametri di A!

Deep copy
  >>> d = a.copy()
  >>> e = a[:,9].copy() # copia parziale
Array di Indici di Array
  >>> a = np.arange(12)**2                       # the first 12 square numbers
  >>> i = np.array([1, 1, 3, 8, 5])              # an array of indices
  >>> a[i]                                       # the elements of a at the positions i
  array([ 1,  1,  9, 64, 25])