TypeError из hstack на разреженных матрицах

1

У меня две разреженные матрицы csr. Один содержит преобразование из sklearn.feature_extraction.text.TfidfVectorizer а другой преобразован из массива numpy. Я пытаюсь сделать scipy.sparse.hstack на двух, чтобы увеличить мою функциональную матрицу, но я всегда получаю ошибку:

TypeError: 'coo_matrix' object is not subscriptable

Ниже приведен код:

vectorizer = TfidfVectorizer(analyzer="char", lowercase=True, ngram_range=(1, 2), strip_accents="unicode")
ngram_features = vectorizer.fit_transform(df["strings"].values.astype(str))

list_other_features = ["entropy", "string_length"]
other_features = csr_matrix(df[list_other_features].values)

joined_features = scipy.sparse.hstack((ngram_features, other_features))

Обе матрицы признаков - scipy.sparse.csr_matrix объекты scipy.sparse.csr_matrix и я также попытался не конвертировать другие_файлы, оставив их как numpy.array, но это приводит к той же ошибке.

Пакетные версии Python:

numpy == 1.13.3
pandas == 0.22.0
scipy == 1.1.0

Я не могу понять, почему в этом случае речь идет о объекте coo_matrix, особенно когда у меня есть обе матрицы, преобразованные в csr_matrix. Глядя на scipy-код, я понимаю, что он не будет делать никакого преобразования, если входные матрицы являются объектами csr_matrix.

Теги:
numpy
scipy
sparse-matrix

2 ответа

1
Лучший ответ

В исходном коде scipy.sparse.hstack он вызывает bmat, где он потенциально преобразует матрицы в coo_matrix если случаи быстрого пути не установлены.


диагностика

Глядя на scipy-код, я понимаю, что он не будет делать никакого преобразования, если входные матрицы являются объектами csr_matrix.

В исходном коде bat Есть фактически больше условий, кроме двух матриц, являющихся csr_matrix прежде чем он не будет превращен в объекты coo_matrix. Увидев исходный код, необходимо выполнить одно из следующих условий:

# check for fast path cases
if (N == 1 and format in (None, 'csr') and all(isinstance(b, csr_matrix)
                                               for b in blocks.flat)):
    ...
elif (M == 1 and format in (None, 'csc')
      and all(isinstance(b, csc_matrix) for b in blocks.flat)):
    ...

перед строкой 573 A = coo_matrix(blocks[i,j]).


Предложение

Чтобы решить проблему, я предлагаю вам сделать еще одну проверку, чтобы узнать, встретите ли вы случай быстрого пути для csr_matrix или csc_matrix (два указанных выше условия). Пожалуйста, см. Весь исходный код для bat чтобы получить лучшее понимание. Если вы не удовлетворите условиям, вам будет отправлено преобразование матриц в coo_matrix.

  • 0
    В конце концов, как вы сказали, условия не были выполнены. Я перепутал N и M, так что это было условие, на котором он не справился. Теперь он работает без усилий.
  • 0
    @Tobias рад, что это помогает!
0

Немного неясно, возникает ли эта ошибка в hstack или после того, как вы используете результат.

Если в hstack вам нужно предоставить трассировку, чтобы мы могли видеть, что происходит.

hstack, используя bmat, обычно собирает атрибуты coo всех входных данных и объединяет их для создания новой матрицы coo. Поэтому, независимо от ввода (за исключением особых случаев), результатом будет coo. Но hstack также принимает параметр fmt.

Или вы можете добавить .tocsr(). Там нет дополнительной стоимости, если матрица уже csr.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню