Supponiamo di disporre di un array sparse 2d. Nel mio vero caso d'uso sia il numero di righe e colonne sono molto più grandi (diciamo 20000 e 50000) di conseguenza, non può andare bene in memoria quando viene utilizzata una rappresentazione densa:Come moltiplicare in modo elementare una matrice scipy.sparse con un array 1d denso trasmesso?
>>> import numpy as np
>>> import scipy.sparse as ssp
>>> a = ssp.lil_matrix((5, 3))
>>> a[1, 2] = -1
>>> a[4, 1] = 2
>>> a.todense()
matrix([[ 0., 0., 0.],
[ 0., 0., -1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 2., 0.]])
Ora supponiamo di avere un allineamento 1d fitta con tutta la componenti non-zeri di dimensione 3 (o 50000 nel mio caso reale vita):
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
desidero calcolare la moltiplicazione elementwise di a e d secondo i consueti semantica trasmissione di NumPy. Tuttavia, matrici sparse in SciPy sono del np.matrix: l'operatore '*' è sovraccaricato avere comportarsi come una matrice moltiplicare invece del elementwise-moltiplicano:
>>> a * d
array([ 0., -3., 0., 0., 6.])
Una soluzione sarebbe quella di fare ' un' interruttore per la semantica di matrice per il '*' operatore, che avrebbe dato il risultato atteso:
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
Ma non può farlo in quanto la chiamata a ToArray() sarebbe materializzarsi la versione densa di 'a', che non si adatta alla memoria (e anche il risultato sarà denso):
>>> ssp.issparse(a.toarray())
False
Qualche idea su come costruire questo mantenendo solo le strutture dati sparse e senza dover fare un loop python non efficiente sulle colonne di 'a'?
Se 'd' è una matrice sparsa della stessa dimensione come' a' è possibile utilizzare 'a.multiply (d)'. Forse puoi fare un 'd' che è N righe lunghe e passare su N righe di' a' alla volta? – mtrw
Ma d è denso e non può essere trasmesso esplicitamente in memoria per soddisfare i requisiti di forma multipla. Fare un ciclo su un lotto è un'opzione ma trovo questo un po 'hackerato. Avrei pensato che esistesse un modo vanigliato/scipy per farlo senza un loop python. – ogrisel
Immagino che il problema sia la rappresentazione di una matrice (sparsa) ma l'operazione multipla di un array. Penso che dovrai sfornare il tuo sfortunatamente. – mtrw