В SciPy модное индексирование для csr_matrices - PullRequest
4 голосов
/ 22 июля 2011

Я новичок в Python, поэтому простите меня заранее, если это элементарный вопрос, но я искал вокруг и не нашел удовлетворительного ответа.

Я пытаюсь сделать следующее, используя NumPy и SciPy:

I,J = x[:,0], x[:1]               # x is a two column array of (r,c) pairs
V = ones(len(I))
G = sparse.coo_matrix((V,(I,J)))  # G's dimensions are 1032570x1032570
G = G + transpose(G)
r,c = G.nonzero()
G[r,c] = 1
...
NotImplementedError: Fancy indexing in assignment not supported for csr matrices

В значительной степени я хочу, чтобы все ненулевые значения были равны 1 после добавления транспонирования, но я получаю причудливые сообщения об ошибках индексации.

В качестве альтернативы, если бы я мог показать, что матрица G симметрична, добавление транспонирования не было бы необходимым.

Любое понимание любого из этих подходов будет очень цениться.

1 Ответ

6 голосов
/ 22 июля 2011

В дополнение к выполнению чего-то вроде G = G / G, вы можете оперировать с G.data.

Таким образом, в вашем случае вы можете выполнить:

G.data  = np.ones(G.nnz)

или

G.data[G.data != 0] = 1

Будет делать то, что вы хотите.Это более гибко, так как позволяет вам предварительно формировать фильтры других типов (например, G.data[G.data > 0.9] = 1 или G.data = np.random.random(G.nnz))

Вторая опция будет устанавливать значения в единицу, только если они имеют ненулевое значение.Во время некоторых вычислений вы получите нулевые значения, которые являются «плотными» (т. Е. Они фактически сохраняются как значения в разреженном массиве).(Вы можете удалить их на месте с помощью G.eliminate_zeros())

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