Scienza dei dati

Come calcolare le matrici in Python senza NumPy

Come calcolare le matrici in Python senza NumPy
Per molte applicazioni è necessaria la matematica. In Python c'è il modulo matematico che gestisce le basi come le funzioni di arrotondamento, fattoriale e arrotondamento. Include anche le funzioni Potenza e logaritmica, trigonometria,  angolari e iperboliche. Per i numeri complessi, il modulo è cmath. Questi però non gestiscono le operazioni con le matrici.

Qual è la differenza tra array e matrici?

Alcune persone cercano soluzioni matriciali per problemi di array, quindi qual è la differenza??  La grande differenza è che i valori della matrice sono numeri, un array può contenere altre informazioni, anche stringhe.  Le matrici possono rappresentare equazioni, è qui che la maggior parte degli sviluppatori ne ha bisogno, almeno nel caso di sostituzione di NumPy.

Come si esegue un calcolo matriciale??

Le operazioni standard con le matrici sono semplici da fare, quando si sommano basta aggiungere gli elementi, quando si moltiplicano si può usare uno scalare per ogni elemento e così via.

La moltiplicazione è un po' più complessa ma di molto poco. Ciò che lo rende pesante è che devi fare molti calcoli per ogni soluzione, è qui che entrano in gioco le prestazioni. Poiché la maggior parte dei calcoli non dipende l'uno dall'altro, questi calcoli sono ottimi candidati per il calcolo parallelo. Le GPU sono progettate per questo tipo di calcoli e sono progettate per essere aggiunte facilmente ai sistemi desktop.

Quando devi eseguire calcoli con matrici in Python, la prima soluzione che trovi è numPy.  Tuttavia NumPy non è sempre il sistema più efficiente per calcolare molte matrici.
Questo post tratterà quali opzioni hai in Python.

Quando hai bisogno di alternative, inizia cercando più attentamente a cosa ti servono le operazioni con le matrici. La tua installazione attuale potrebbe già avere una propria implementazione o sta usando una libreria sottostante. Un esempio è l'apprendimento automatico, in cui la necessità di operazioni con matrici è fondamentale. TensorFlow ha una propria libreria per le operazioni con le matrici. Assicurati di conoscere la tua libreria attuale.

In molti casi, però, hai bisogno di una soluzione che funzioni per te. Forse ci sono limitazioni in  NumPy, alcune librerie sono più veloci di NumPy e realizzate appositamente per le matrici. Molte volte, gli sviluppatori vogliono velocizzare il loro codice in modo da iniziare a cercare alternative. Uno dei motivi è che NumPy non può essere eseguito su GPU.

Sebbene questo post riguardi alternative a NumPy, una libreria costruita su NumPy, è necessario menzionare la Theano Library. La libreria Theano è strettamente integrata con NumPy e abilita la matrice supportata dalla GPU. Theano è una libreria più grande per l'apprendimento automatico ma puoi estrarre solo le funzioni della matrice.

Per una spiegazione più approfondita sull'utilizzo di Theano, vedere questa pagina: http://www.marekrei.com/blog/theano-tutorial/

SpPy è una libreria specifica per array sparsi, può ancora essere utilizzata per le matrici. Un array sparso, tra l'altro, è un array che contiene molti valori zero. Questa libreria è piccola ed efficiente ma un po' limitata a causa della sua specializzazione. Utilizza anche NumPy ma è più efficiente del solo NumPy.
https://pythonhosted.org/spy/

Eigen è un'efficiente implementazione di matrici, per usarlo in Python è necessario miniEigen, disponibile su https://pypi.org/pypi/minieigen. Eigen è effettivamente incluso in molte altre soluzioni. Funge da libreria di matrici generica per moduli e framework più specializzati. Questa libreria ha molti moduli per la manipolazione di matrici dense e array. Supporta anche l'algebra lineare, la decomposizione e l'algebra lineare sparsa. Il pacchetto ha anche una funzione plug-in in modo da poter aggiungere i propri moduli.
Per usare Eigen, installalo con pip e importalo nel tuo codice.

PyTorch è una libreria per l'apprendimento automatico, per questo ha operazioni di matrice. L'importazione dell'intera libreria è eccessiva se vuoi solo fare qualche calcolo. Tuttavia, se stai appena iniziando con un progetto di apprendimento automatico, assicurati di decidere se questo fa per te.
Un'altra alternativa è prendere qualsiasi libreria C e usarla. Per renderlo possibile, c'è una soluzione chiamata cffi che creerà l'interfaccia per te. Questa soluzione richiede che tu conosca già C e che crei un wrapper per ogni funzione di cui hai bisogno. Il codice sembrerà quindi confuso e difficile da leggere, ma potrebbe valerne la pena a seconda del progetto.

Se vuoi solo velocizzare tutti gli array e le funzioni numeriche puoi invece usare numba. Numba è un compilatore Python. Quando lo usi, il compilatore creerà un codice binario "just in time", jit. L'idea di jit è più comunemente usata con Java ma è molto utile per la matematica pesante in Python. Poiché Python è interpretato, puoi avere problemi di prestazioni con la matematica pesante, numba si occupa di questo compilando su CPU o GPU a tua scelta.
Sono disponibili anche funzionalità di calcolo parallelo, per impostazione predefinita il compilatore viene eseguito con un blocco che interrompe l'esecuzione di molti thread contemporaneamente. Puoi disattivarlo con un flag fintanto che sei a conoscenza dei potenziali problemi associati alla programmazione parallela.

Conclusione

Molte volte quando inizi a programmare in Python o in altri linguaggi, ti imbatti in limitazioni del linguaggio, del compilatore o di qualcos'altro. Quando ti trovi in ​​questa situazione, dovresti fermarti e pensare a quale limitazione hai e considerare quanti altri potrebbero aver avuto la stessa situazione. Nel caso di Python e NumPy, molti scienziati e sviluppatori hanno scritto codice che richiede un'esecuzione rapida fast. Questa eredità ha creato un gran numero di rami che potrebbero risolvere il tuo problema senza costringerti a cambiare lingua o scrivere una nuova estensione per questa particolare lingua.

Tutorial OpenTTD
OpenTTD è uno dei giochi di simulazione aziendale più popolari in circolazione. In questo gioco, devi creare una meravigliosa attività di trasporto. T...
SuperTuxKart per Linux
SuperTuxKart è un fantastico titolo progettato per offrirti l'esperienza di Mario Kart gratuitamente sul tuo sistema Linux. È piuttosto impegnativo e ...
Tutorial Battaglia per Wesnoth
The Battle for Wesnoth è uno dei giochi di strategia open source più popolari a cui puoi giocare in questo momento. Non solo questo gioco è in svilupp...