Załóżmy, że mam scipy.sparse.csr_matrix
reprezentujących wartości poniżejscipy Rzadki cumSum
[[0 0 1 2 0 3 0 4]
[1 0 0 2 0 3 4 0]]
Chcę obliczyć skumulowaną sumę wartości niezerowych w miejscu, które mogłyby zmienić tablicę:
[[0 0 1 3 0 6 0 10]
[1 0 0 3 0 6 10 0]]
Rzeczywiste wartości to nie 1, 2, 3, ...
Liczba niezerowych wartości w każdym rzędzie jest mało prawdopodobna.
Jak zrobić to szybko?
Aktualny Program:
import scipy.sparse
import numpy as np
# sparse data
a = scipy.sparse.csr_matrix(
[[0,0,1,2,0,3,0,4],
[1,0,0,2,0,3,4,0]],
dtype=int)
# method
indptr = a.indptr
data = a.data
for i in range(a.shape[0]):
st = indptr[i]
en = indptr[i + 1]
np.cumsum(data[st:en], out=data[st:en])
# print result
print(a.todense())
Wynik:
[[ 0 0 1 3 0 6 0 10]
[ 1 0 0 3 0 6 10 0]]
dla kodu pracy, należy dodawać do https://codereview.stackexchange.com/ – Alexander
Istnieje wiele bardziej 'NumPy/scipy' na oczy TAK niż na CR. Szybkie pytania na temat działającego kodu są cały czas odbierane przez SO, zwłaszcza, że pakiety kodu są nieco wyspecjalizowane. – hpaulj
'@r xu', to, co pokazujesz, wygląda dobrze. Zastosowanie wiersza 'cumsum 'po wierszu jest naprawdę tylko drogą do zrobienia. A twoje użycie 'out' jest sprytne. Istnieje też "itptr", który może trochę poprawić prędkość. – hpaulj