Как получить доступ к разреженным матричным элементам?
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], который должен возвращать первый столбец, но я ничего не печатаю. Почему?
Ответы
Ответ 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)]