Aby zaimplementować a = (b/x[:, np.newaxis]).sum(axis=1)
, można użyć a = b.sum(axis=1).A1/x
. Atrybut A1
zwraca 1d ndarray, więc wynikiem jest 1d ndarray, a nie matrix
. To zwięzłe wyrażenie działa, ponieważ jesteś zarówno skalowanie przez x
i zsumowanie wzdłuż osi 1. Na przykład:
In [190]: b
Out[190]:
<3x3 sparse matrix of type '<type 'numpy.float64'>'
with 5 stored elements in Compressed Sparse Row format>
In [191]: b.A
Out[191]:
array([[ 1., 0., 2.],
[ 0., 3., 0.],
[ 4., 0., 5.]])
In [192]: x
Out[192]: array([ 2., 3., 4.])
In [193]: b.sum(axis=1).A1/x
Out[193]: array([ 1.5 , 1. , 2.25])
Ogólniej, jeśli chcesz przeskalować wiersze rozrzedzony matrycy z wektorem x
, można pomnóż b
po lewej stronie z rzadką macierzą zawierającą 1.0/x
na przekątnej. Funkcja scipy.sparse.spdiags
może być użyta do utworzenia takiej matrycy. Na przykład:
In [71]: from scipy.sparse import csc_matrix, spdiags
In [72]: b = csc_matrix([[1,0,2],[0,3,0],[4,0,5]], dtype=np.float64)
In [73]: b.A
Out[73]:
array([[ 1., 0., 2.],
[ 0., 3., 0.],
[ 4., 0., 5.]])
In [74]: x = array([2., 3., 4.])
In [75]: d = spdiags(1.0/x, 0, len(x), len(x))
In [76]: d.A
Out[76]:
array([[ 0.5 , 0. , 0. ],
[ 0. , 0.33333333, 0. ],
[ 0. , 0. , 0.25 ]])
In [77]: p = d * b
In [78]: p.A
Out[78]:
array([[ 0.5 , 0. , 1. ],
[ 0. , 1. , 0. ],
[ 1. , 0. , 1.25]])
In [79]: a = p.sum(axis=1)
In [80]: a
Out[80]:
matrix([[ 1.5 ],
[ 1. ],
[ 2.25]])
Aby było jasne, chcesz podzielić element na oś 1? tj. wszystkie elementy "N" z 'b [i,:]' są podzielone przez 'x [i]'? – askewchan
Tak. "Aby było jasne", dlatego uwzględniłem kod. ;) – Juan