У меня две разреженные матрицы 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
.
В исходном коде 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
.
Немного неясно, возникает ли эта ошибка в hstack
или после того, как вы используете результат.
Если в hstack
вам нужно предоставить трассировку, чтобы мы могли видеть, что происходит.
hstack
, используя bmat
, обычно собирает атрибуты coo
всех входных данных и объединяет их для создания новой матрицы coo
. Поэтому, независимо от ввода (за исключением особых случаев), результатом будет coo
. Но hstack
также принимает параметр fmt
.
Или вы можете добавить .tocsr()
. Там нет дополнительной стоимости, если матрица уже csr
.