Python versione Bignami - Array numpy

Import

from numpy import *

Creazione

def f(x, y):
    return x ** 2 + y ** 2
a = fromfunction(f, (10, 10))

Operazioni

Indicizzazione

I vettori si indicizzano come le liste Python:

>>> a = arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[1]
1
>>> a[1] = 10
>>> a
array([ 0, 10,  2,  3,  4,  5,  6,  7,  8,  9])
>>> a[2:6]
array([2, 3, 4, 5])
>>> a[2:8:2]
array([2, 4, 6])
>>> a[:2:-1]
array([9, 8, 7, 6, 5, 4, 3])

Le matrici supportano indici come le liste Python per ogni dimensione:

>>> def f(x,y):
...         return 10*x+y
...
>>> b = fromfunction(f,(5,4))
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> b[2,3]
23
>>> b[:,1]                   # la seconda colonna di b
array([ 1, 11, 21, 31, 41])
>>> b[1:3,:]                 # la seconda e terza riga di b
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])
>>> b[1:4,1:3]               # Sottomatrice
array([[11, 12],
       [21, 22],
       [31, 32]])

Omettendo indici si intende la riga / colonna / sottomatrice intera:

>>> b[-1]                    # l'ultima riga. Equivalente a b[-1,:]
array([40, 41, 42, 43])

Iterazione

>>> def f(x,y):
...         return 10*x+y
...
>>> b = fromfunction(f,(5,4))
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> for row in b:
...   print row
...   for el in row:
...     print " ", el
...
[0 1 2 3]
 0
 1
 2
 3
[10 11 12 13]
 10
 11
 12
 13
[20 21 22 23]
 20
 21
 22
 23
[30 31 32 33]
 30
 31
 32
 33
[40 41 42 43]
 40
 41
 42
 43
>>> for element in b.flat:
...    print element,
...
0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43

Plot di un vettore

from pylab import *
a = linspace(0, 3*pi, 100)
plot(a, sin(a), 'b-', a, cos(a), 'r-')
show()

Salvare su disco e caricare da disco

# Salva in formato binario.
# Viene salvata la sequenza grezza di numeri, senza informazioni sul tipo
# di dato o sulle dimensioni
a = fromfunction(lambda x, y: x**2 + y**2, (5, 5))
a.tofile("/tmp/matrice")

# Carica da file.  Bisogna specificare il tipo di dato (se non è float) e
# le dimensioni (se non è un vettore)
b = fromfile("/tmp/matrice", int)
b.shape = (5, 5)

# Salva in formato testo
a.tofile("/tmp/matrice.txt", sep=",", format="%d")

# Carica da file in formato testo
b = fromfile("/tmp/matrice.txt", sep=",")
b.shape = (5, 5)

Gestione degli errori di calcolo

Normalmente numpy ignora gli errori durante il calcolo. Questo comportamento si può cambiare usando numpy.seterr:

numpy.seterr(divide=None, over=None, under=None, invalid=None)

Ognuno dei parametri può essere settato a:

I parametri, tutti opzionali, rappresentano:

seterr restituisce un dizionario con le impostazioni che erano attive prima che fosse chiamata.

Per settare la callback si usa seterrcall:

numpy.seterrcall(funzione)

La funzione callback prende due parametri, una stringa con la descrizione dell'errore e un numero i cui bit rappresentano il tipo di errore.

Esempio:

# Funzione callback
def handler(msg, status):
    print msg
    if status & 1 != 0: print "Errore di divisione"
    if status & 2 != 0: print "Overflow"
    if status & 4 != 0: print "Underflow"
    if status & 8 != 0: print "Operazione non valida"

# Imposta la callback
numpy.seterrcall(handler)

# Configura la gestione degli errori di calcolo
old = numpy.seterr(divide="raise", over="call", under="warn", invalid="raise")

# Stampa la vecchia configurazione
print "Old settings:"
for type, val in old.iteritems():
    print "%s: %s" % (type, val)

Link