Подтвердить что ты не робот

Как получить доступ к разреженным матричным элементам?

type(A)
<class 'scipy.sparse.csc.csc_matrix'>
A.shape
(8529, 60877)
print A[0,:]
  (0, 25)   1.0
  (0, 7422) 1.0
  (0, 26062)    1.0
  (0, 31804)    1.0
  (0, 41602)    1.0
  (0, 43791)    1.0
print A[1,:]
  (0, 7044) 1.0
  (0, 31418)    1.0
  (0, 42341)    1.0
  (0, 47125)    1.0
  (0, 54376)    1.0
print A[:,0]
  #nothing returned

Теперь я не понимаю, когда я набираю A [1,:], который должен выбирать элементы из второй строки, но я получаю элементы из первой строки в печати. Когда я набираю A [:, 0], который должен возвращать первый столбец, но я ничего не печатаю. Почему?

4b9b3361

Ответ 1

A[1,:] сам по себе является разреженной матрицей с формой (1, 60877). Это то, что вы печатаете, и имеет только одну строку, поэтому все координаты строк равны 0.

Например:

In [12]: a = csc_matrix([[1,0,0,0],[0,0,10,11],[0,0,0,99]])

In [13]: a.todense()
Out[13]: 
matrix([[ 1,  0,  0,  0],
        [ 0,  0, 10, 11],
        [ 0,  0,  0, 99]])

In [14]: print a[1,:]
  (0, 2)    10
  (0, 3)    11

In [15]: print a
  (0, 0)    1
  (1, 2)    10
  (1, 3)    11
  (2, 3)    99

In [16]: print a[1,:].toarray()
[[ 0  0 10 11]]

Вы можете выбрать столбцы, но если в столбце нет ненулевых элементов, ничего не отображается, когда он выводится с помощью оператора print:

In [18]: a[:,3].toarray()
Out[18]: 
array([[ 0],
       [11],
       [99]])

In [19]: print a[:,3]
  (1, 0)    11
  (2, 0)    99

In [20]: a[:,1].toarray()
Out[20]: 
array([[0],
       [0],
       [0]])

In [21]: print a[:,1]

Последний оператор печати не отображает вывод, потому что столбец a [:, 1] не имеет ненулевых элементов.

Ответ 2

Чтобы ответить на свой вопрос с заголовком, используя другую технику, чем ваши детали вопроса:

csc_matrix предоставляет метод .nonzero().

Дано:

>>> import numpy as np
>>> from scipy.sparse.csc import csc_matrix
>>> 
>>> row = np.array( [0, 1, 3])
>>> col = np.array( [0, 2, 3])
>>> data = np.array([1, 4, 16])
>>> A = csc_matrix((data, (row, col)), shape=(4, 4))

Вы можете получить доступ к индексам, поглаживающим ненулевые данные, с помощью:

>>> rows, cols = A.nonzero()
>>> rows
array([0, 1, 3], dtype=int32)
>>> cols
array([0, 2, 3], dtype=int32)

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

>>> [((i, j), A[i,j]) for i, j in zip(*A.nonzero())]
[((0, 0), 1), ((1, 2), 4), ((3, 3), 16)]