Jump to content
  • #5 Introduzione a Python: NumPy


     Share

    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)

     

    oaznIiK.png

     

    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]

     

     

     Share


    User Feedback

    Recommended Comments

    There are no comments to display.


×
×
  • Create New...

Important Information

Terms of Use Privacy Policy Guidelines We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.