вычислить среднее значение разреженной матрицы, игнорируя нули - PullRequest
0 голосов
/ 25 октября 2019

Я пытался найти способ вычислить среднее по столбцам разреженной матрицы, игнорируя нулевые значения. для пустого массива я мог бы сделать это:

arr = np.array([[1, 1, 1, 1, 1, 1, 0, 0, 0],
                [1, 0, 0, 0, 1, 0, 1, 0, 0],
                [0, 0, 0, 0, 1, 1, 0, 1, 0],
                [0, 1, 0, 0, 0, 0, 0, 1, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 4],
                [0, 0, 0, 0, 0, 0, 0, 0, 5],
                [0, 0, 0, 0, 0, 0, 0, 0, 1]])
arr[arr == 0] = np.nan
means = np.nanmean(arr, axis=0)

или я мог бы сделать:

#I don't understand why tmean axis=1 doesn't work. I ended up with this
f = lambda x: tmean(x,(0,None),(False,None))
means = list(map(f,arr.T))

наконец, я хочу сохранить значения выше среднего в каждом столбце

arr[arr<means.reshape(1,arr.shape[1])]=0

array([[1., 1., 1., 1., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 1., 1., 0., 1., 0.],
       [0., 1., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 4.],
       [0., 0., 0., 0., 0., 0., 0., 0., 5.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.]])

Как мне добиться этого с разреженной матрицей? arr_csr = csr_matrix(arr)

Ответы [ 2 ]

0 голосов
/ 25 октября 2019
In [339]: arr = np.array([[1, 1, 1, 1, 1, 1, 0, 0, 0], 
     ...:                 [1, 0, 0, 0, 1, 0, 1, 0, 0], 
     ...:                 [0, 0, 0, 0, 1, 1, 0, 1, 0], 
     ...:                 [0, 1, 0, 0, 0, 0, 0, 1, 0], 
     ...:                 [0, 0, 0, 0, 0, 0, 0, 0, 4], 
     ...:                 [0, 0, 0, 0, 0, 0, 0, 0, 5], 
     ...:                 [0, 0, 0, 0, 0, 0, 0, 0, 1]])                         
In [340]: sparse                                                                
Out[340]: <module 'scipy.sparse' from '/usr/local/lib/python3.6/dist-packages/scipy/sparse/__init__.py'>
In [341]: M =sparse.csr_matrix(arr)                                             
In [342]: M                                                                     
Out[342]: 
<7x9 sparse matrix of type '<class 'numpy.int64'>'
    with 17 stored elements in Compressed Sparse Row format>
In [343]: M.sum(axis=1)                                                         
Out[343]: 
matrix([[6],
        [3],
        [3],
        [2],
        [4],
        [5],
        [1]])
In [344]: M.getnnz(axis=1)                                                      
Out[344]: array([6, 3, 3, 2, 1, 1, 1], dtype=int32)
In [345]: M.sum(axis=1).A1/M.getnnz(axis=1)                                     
Out[345]: array([1., 1., 1., 1., 4., 5., 1.])
In [346]: M.mean(axis=1)                                                        
Out[346]: 
matrix([[0.66666667],
        [0.33333333],
        [0.33333333],
        [0.22222222],
        [0.44444444],
        [0.55555556],
        [0.11111111]])
0 голосов
/ 25 октября 2019

scipy разреженные матрицы имеют данные атрибутов и индексы, вы можете использовать эти два для вычисления среднего по оси столбца и дальнейшей проверки, которые выше среднего. Пример:

row = np.array([0,0,1,2,2,2])
col = np.array([0,2,2,0,1,2])
data = np.array([1,2,3,4,5,6])
m = csr_matrix((data,(row,col)),shape=(3,3))
# m = [[1,0,2],
#      [0,0,3],
#      [4,5,6]]
print(m.data)
print(m.indices)

Редактировать: немного фона для csr-формата. Каждая запись в m.indices (скажем, i, m.indices[i]) представляет собой индекс столбца соответствующей записи в m.data (m.data[i]).

Пример взят из документации scipy: https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...