VSTACK scipy.sparse.csr.csr_matrix в одну матрицу csr

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

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

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

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

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

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

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

Питон 3.8.2, Сципи 1.4.1


person Guenter    schedule 08.05.2020    source источник
comment
Нам будет проще понять вашу проблему, если вы явно покажете, как вы определяете sp. Я предполагаю, что вы сделали import scipy as sp. Если это так, то sp.vstack — это точно такая же функция, как numpy.vstack. Путаница, вызванная этим дублированием, является одной из причин того, что включение пустых имен в пространство имен scipy устарело. Для разреженных матриц вам нужно scipy.sparse.vstack, как в ответе @Tinu.   -  person Warren Weckesser    schedule 08.05.2020
comment
Спасибо за разъяснение. Я разместил окончательный ответ ниже   -  person Guenter    schedule 12.05.2020


Ответы (2)


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

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.

person Tinu    schedule 08.05.2020
comment
интересно, спасибо! Я еще посмотрю на это - person Guenter; 08.05.2020
comment
Я не могу объяснить, почему мы видим разные результаты.. ››› vec_list = [] ››› for i in range(100): ... vec_list.append(csr_matrix(np.random.randint(2,size=(1,200)) ))) ... ››› ››› a = np.vstack(vec_list) ››› b = np.vstack(vec_list) ››› a.shape, b.shape ((100, 1), (100 , 1)) - person Guenter; 11.05.2020
comment
Взгляните на первый комментарий @Warren Weckesser под вашим вопросом. Я использую scipy.sparse.vstack, тогда как вы используете numpy.vstack, эти две функции не будут возвращать одно и то же для разреженных массивов. - person Tinu; 11.05.2020

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

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

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

person Guenter    schedule 12.05.2020