zeros - python matrix multiplication




Matrici molto grandi che usano Python e NumPy (8)

È un po 'alfa, ma http://blaze.pydata.org/ sembra che stia lavorando per risolvere questo problema.

NumPy è una libreria estremamente utile, e dal suo utilizzo ho scoperto che è in grado di gestire matrici che sono abbastanza grandi (10000 x 10000) facilmente, ma inizia a lottare con qualcosa di molto più grande (cercando di creare una matrice di 50000 x 50000 non riesce). Ovviamente, questo è dovuto ai massicci requisiti di memoria.

C'è un modo per creare enormi matrici nativamente in NumPy (diciamo 1 milione per 1 milione) in qualche modo (senza avere diversi terrabytes di RAM)?


A volte una soluzione semplice utilizza un tipo personalizzato per gli elementi della matrice. In base alla gamma di numeri necessari, puoi utilizzare un dtype manuale e specialmente più piccolo per i tuoi articoli. Poiché Numpy considera il tipo più grande per oggetto per impostazione predefinita, questa potrebbe essere un'idea utile in molti casi. Ecco un esempio:

In [70]: a = np.arange(5)

In [71]: a[0].dtype
Out[71]: dtype('int64')

In [72]: a.nbytes
Out[72]: 40

In [73]: a = np.arange(0, 2, 0.5)

In [74]: a[0].dtype
Out[74]: dtype('float64')

In [75]: a.nbytes
Out[75]: 32

E con tipo personalizzato:

In [80]: a = np.arange(5, dtype=np.int8)

In [81]: a.nbytes
Out[81]: 5

In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16)

In [78]: a.nbytes
Out[78]: 8

Di solito quando trattiamo con matrici di grandi dimensioni li implementiamo come Matrici sparse .

Non so se Numpy supporta matrici sparse, ma ho trovato this invece.


Dovresti essere in grado di usare numpy.memmap in memoria per mappare un file su disco. Con il nuovo python e la macchina a 64 bit, si dovrebbe avere lo spazio di indirizzamento necessario, senza caricare tutto in memoria. Il sistema operativo deve gestire solo mantenere una parte del file in memoria.


Per gestire matrici sparse, hai bisogno del pacchetto scipy che si trova in cima a numpy - guarda here per maggiori dettagli sulle opzioni sparse-matrix che scipyscipy .


Per quanto ne so di numpy, no, ma potrei sbagliarmi.

Posso proporvi questa soluzione alternativa: scrivere la matrice sul disco e accedervi in ​​blocchi. Ti suggerisco il formato di file HDF5. Se è necessario in modo trasparente, è possibile reimplementare l'interfaccia ndarray per impaginare in memoria la matrice memorizzata su disco. Fai attenzione se modifichi i dati per sincronizzarli di nuovo sul disco.


Stai chiedendo come gestire una matrice di elementi da 2.500.000.000 senza terabyte di RAM?

Il modo di gestire 2 miliardi di elementi senza 8 miliardi di byte di RAM è non mantenendo la matrice in memoria.

Ciò significa algoritmi molto più sofisticati per scaricarlo dal file system in pezzi.


numpy.array s sono pensati per vivere nella memoria. Se vuoi lavorare con matrici più grandi della tua RAM, devi ovviare a questo. Ci sono almeno due approcci che puoi seguire:

  1. Prova una rappresentazione matriciale più efficiente che sfrutti qualsiasi struttura speciale delle tue matrici. Ad esempio, come altri hanno già sottolineato, esistono efficienti strutture di dati per matrici sparse (matrici con molti zeri), come scipy.sparse.csc_matrix .
  2. Modifica il tuo algoritmo per lavorare su submatrices . È possibile leggere dal disco solo i blocchi di matrice attualmente utilizzati nei calcoli. Gli algoritmi progettati per essere eseguiti su cluster di solito funzionano in senso anti-orario, poiché i dati sono distribuiti su computer diversi e vengono trasmessi solo quando necessario. Ad esempio, l'algoritmo Fox per la moltiplicazione della matrice (file PDF) .






numpy