VSTACK scipy.sparse.csr.csr_matrix в одну единственную матрицу csr - PullRequest
0 голосов
/ 08 мая 2020

Недавно я изо всех сил пытался работать с разреженными матрицами и складывать их в одну матрицу. Я использовал для создания нескольких объектов csr_matrix

vec_list = sp.sparse.csr_matrix(my_vec_i) # every vector of shape (1,200)

И после того, как vec_list состоял примерно из 100 разреженных матриц, я использовал функцию scipy (НЕ numpy s) sp.vstack, чтобы объединить все 100 записей в csr matrix of shape (100, 200).

Теперь в моих текущих настройках (python 3.8 ) я вижу предупреждение о том, что sp.vstack будет устаревшим, но в любом случае, неважно, использовал ли я numpy или scipy vstack, у меня появился массив формы (100,1) , где мои 200 столбцов рассматриваются как 1 запись csr_matrix в первом и единственном столбце .

В моих старых фрагментах кода я мог видеть, что sp.vstack(vec_list) создал разреженную матрицу crs формы (100,200) .. Я что-то пропустил, есть ли у кого-нибудь мысли по этому поводу? Я немного отчаялся создать свою сложенную разреженную матрицу .. спасибо всем

Edit: Как вы можете видеть ниже в моем комментарии, np.vstack и sp.vstack не обязательно делают то же самое (в моем ответ np.vstack я дважды грустил, но один раз имел ввиду sp.vstack). Я использовал точное решение (скопированное), и в какой-то момент оно вернуло ошибку, так как не было складывания. Чтобы использовать sp.stacking, я сложил массивы, отличные от csr_matrix, а затем преобразовал их в csr_matrix. Это нецелесообразно при использовании огромных наборов массивов, но, по крайней мере, я мог без проблем запустить файл. Чтобы ответить на приведенный ниже ответ от Tinu, я не смог решить его таким образом, поскольку результат выглядит следующим образом - при выполнении кода примера:

>>> np.vstack(vec_list).shape
(100, 1)
>>> sp.vstack(vec_list).shape
(100, 200)

Python 3.8.2 , Scipy 1.4.1

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

к сожалению, я не могу воспроизвести вашу ошибку. Вот мой код:

from scipy.sparse import csr_matrix, vstack
import numpy as np

vec_list = []
for i in range(100):
    vec_list.append(csr_matrix(np.random.randint(2,size=(1,200))))
vec_mat = vstack(vec_list)
vec_mat.shape

Вывод:

(100, 200)

Я использую python 3.8.2 и scipy 1.4.1

0 голосов
/ 12 мая 2020

Я, к сожалению, не смог увидеть тот же результат, что указан выше - используя мой Python 3.8.3rc1. Копирование кода и наложение приводит к следующему:

>>> np.vstack(vec_list).shape # (100, 1)
>>> sp.vstack(vec_list).shape # (100, 1)

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

...