NumPy
Numpy è una libreria open source per il linguaggio di programmazione Python, che aggiunge supporto a grandi matrici e array multidimensionali insieme a una vasta collezione di funzioni matematiche di alto livello per poter operare efficientemente su queste strutture dati
Sito ufficiale: www.numpy.org
Ndarray class
Un oggetto ndarray è un array n-dimensionale (tensore)
Simile ad una lista Python ma:
- tutti gli elementi di un array devono essere dello stesso tipo (tipicamente int o float)
- sono molto più efficienti e pensati per dati n-dimensioni (con n grande)
Generare un array
Un array viene creato tramite il metodo costruttore array()
Due argomenti
- una lista contenente i valori
- una specifica del tipo di dato
a = np.array([1,4,5,8], float) >>> import numpy as np >>> print(np.zeros(2)) [0. 0.] >>> print(np.one( (2,2) ) [[1. 1.] [1. 1.]] >>> print(np.zeros( (2,2,2) ) [[[0. 0.] [0. 0.]] [[0. 0.] [0. 0.]]]
Generare random array
import numpy as np print(np.random.uniform(0,10,size=5)) print(np.random.normal(1,0.2,size=5)) print(np.random.randint(0,2,size=(3,3))) [7.91700684 7.41652128 8.1393401 0.8123227 5.50427964] [1.14191823 0.89203955 1.09505607 0.8081311 0.82282836] [[ 0 0 0] [ 0 1 0] [ 0 1 1]]
Matrici diagonali
import numpy as np print(np.diag(np.ones(3)) [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]] print(np.diag(np.arange(5))) [[ 0 0 0 0 0] [ 0 1 0 0 0] [ 0 0 2 0 0] [ 0 0 0 3 0] [ 0 0 0 0 4]]
Da Pandas a Numpy
E' molto semplice "convertire" una pandas series o un DataFrame in un array numpy
questi oggetti di Pandas sono costruiti su numpy array: il loro array sottostante è accessibile attraverso l'attributo values
import pandas as pd import numpy as np iris=pd.read_csv("iris.csv") print(type(iris.PetalWidth.values)) <type'numpy.ndarray'>
Metodi reshape(), ravel()
La disposizione delle voci in righe, colonne, ecc. può essere modificata con i metodi:
reshape() trasforma la shape dell'array
ravel() trasforma in un array 1D (una copia è fatta solo se necessario)
>>> a=np.arange(6).reshape((3,2)) >>> a array([[0,1], [2,3], [4,5]]) >>> x=np.array([[1,2,3],[4,5,6]]) >>> np.ravel(x) array([1,2,3,4,5,6]) >>> x.reshape(-1) array([1,2,3,4,5,6])
Iterating over arrays
Oggetto iterabile nditer
>>> a=np.arange(6).reshape(2,3) >>> for x in np.nditer(a): print(x,end=' ') ... 0 1 2 3 4 5
Attenzione: di default, numpy sceglie come ordine quello che rende più efficiente l'accesso all'elemento (=segue il memory layout dell'array, ovvero l'ordine con cui gli elementi sono salvati in memoria)
Esempio matrice trasposta:
>>> a=np.arange(6).reshape(2,3) >>> for x in np.nditer(a.T): print(x, end=' ') ... 0 1 2 3 4 5 >>> for x in np.nditer(a.T.copy(order='C')): print(x,end=' ') ... 0 3 1 4 2 5
Modificare i valori di un array
Di default, l'oggetto iterabile nditer non consente la modifica dell'array (read-only object)
Per modificarlo occorre usare i flag readwrite o writeonly
Il nditer produrrà quindi un writable buffer array
Poichè il nditer deve copiare questi dati del buffer nell'array originale al termine dell'iterzione, è necessario segnalare quando termina l'iterazione, mediante:
l'istruzione with
il metodo close()
Una volta che uno di questi metodi è chiamato viene eseguito il write-back
>>> a=np.arange(6).reshape(2,3) >>> a array([[0,1,2], [3,4,5]]) >>> with np.nditer(a, op_flags=['readwrite']) as it: for x in it: x[...]=2*x ... >>> a array([[0,2,4], [6,8,10]])
External loop
In realtà con gli array numpy non è molto conveniente iterare su un singolo elemento alla volta.
Per questo esistono gli external loop che lavorano su chunk di dati
Forzando 'c' o 'F' otteniamo diversi external loop size
>>> a=np.arange(6).reshape(2,3) >>> for x in np.nditer(a, flags=['external_loop']): print(x,end=' ') ... [0 1 2 3 4 5] >>> for x in np.nditer(a, flags=['external_loop'], order='F'): print(x,end=' ') ... [0 3] [1 4] [2 5]
Broadcasting Array Iteration
>>> a=np.arange(3) >>> b=np.arange(6).reshape(2,3) >>> for x,y in np.nditer([a,b]): print("%d:%d" % (x,y), end=' ') ... 0:0 1:1 2:2 0:3 1:4 2:5
Indexing
Un elemento di una lista si accede: x[i][j]
Un elemento di un numpy array si accede x[i,j]
import numpy as np x=np.arange(9).reshape((3,3)) print(x) print(x[0,:]) #first row print(x[:,0]) #first column print(x[1:3, :])#subarray
Operazioni broadcasting
import numpy as np x=np.arange(5)*10 print(x) # [0 10 20 30 40] y=-x print(y) # [0 -10 -20 -30 -40] x=x+y print(z) # [0 0 0 0 0]
Recommended Comments
There are no comments to display.