Scipy hstack 导致“TypeError:类型不支持转换:(dtype('float64'),dtype('O'))”
Posted
技术标签:
【中文标题】Scipy hstack 导致“TypeError:类型不支持转换:(dtype(\'float64\'),dtype(\'O\'))”【英文标题】:Scipy hstack results in "TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))"Scipy hstack 导致“TypeError:类型不支持转换:(dtype('float64'),dtype('O'))” 【发布时间】:2014-04-11 23:12:22 【问题描述】:我正在尝试运行 hstack 以将一列整数值加入到由 TF-IDF 创建的列列表中(这样我最终可以在分类器中使用所有这些列/功能)。
我正在使用 pandas 阅读该列,检查任何 NA 值并将它们转换为数据框中的最大值,如下所示:
OtherColumn = p.read_csv('file.csv', delimiter=";", na_values=['?'])[["OtherColumn"]]
OtherColumn = OtherColumn.fillna(OtherColumn.max())
OtherColumn = OtherColumn.convert_objects(convert_numeric=True)
然后我阅读了我的文本列并运行 TF-IDF 来创建大量功能:
X = list(np.array(p.read_csv('file.csv', delimiter=";"))[:,2])
tfv = TfidfVectorizer(min_df=3, max_features=None, strip_accents='unicode',
analyzer='word',token_pattern=r'\w1,',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1)
tfv.fit(X)
最后,我想将它们全部连接在一起,这就是我们发生错误并且程序无法运行的地方,而且我不确定我是否在这里正确使用了 StandardScaler:
X = sp.sparse.hstack((X, OtherColumn.values)) #error here
sc = preprocessing.StandardScaler().fit(X)
X = sc.transform(X)
X_test = sc.transform(X_test)
完整的错误信息:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-79d1e70bc1bc> in <module>()
---> 47 X = sp.sparse.hstack((X, OtherColumn.values))
48 sc = preprocessing.StandardScaler().fit(X)
49 X = sc.transform(X)
C:\Users\Simon\Anaconda\lib\site-packages\scipy\sparse\construct.pyc in hstack(blocks, format, dtype)
421
422 """
--> 423 return bmat([blocks], format=format, dtype=dtype)
424
425
C:\Users\Simon\Anaconda\lib\site-packages\scipy\sparse\construct.pyc in bmat(blocks, format, dtype)
537 nnz = sum([A.nnz for A in blocks[block_mask]])
538 if dtype is None:
--> 539 dtype = upcast(*tuple([A.dtype for A in blocks[block_mask]]))
540
541 row_offsets = np.concatenate(([0], np.cumsum(brow_lengths)))
C:\Users\Simon\Anaconda\lib\site-packages\scipy\sparse\sputils.pyc in upcast(*args)
58 return t
59
---> 60 raise TypeError('no supported conversion for types: %r' % (args,))
61
62
TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))
【问题讨论】:
【参考方案1】:正如Numpy hstack - "ValueError: all the input arrays must have same number of dimensions" - but they do 中所讨论的,您需要将输入显式转换为sparse.hstack
。 sparse
代码不如核心 numpy
代码那么健壮。
如果X
是带有dtype=float
的稀疏数组,而A
是带有dtype=object
的稠密数组,则可以有多个选项。
sparse.hstack(X, A) # error
sparse.hstack(X.astype(object), A) # cast X to object; return object
sparse.hstack(X, A.astype(float)) # cast A to float; return float
hstack(X.A, A) # make X dense, result will be type object
如果A
包含一些NaN
,A.astype(float)
将起作用。有关 NaN,请参阅 http://pandas.pydata.org/pandas-docs/stable/gotchas.html。如果A
是由于其他原因(例如不完整的列表)而成为对象,那么我们将不得不重新审视这个问题。
另一种可能是使用 Pandas 的concat
。 http://pandas.pydata.org/pandas-docs/stable/merging.html。我认为 Pandas 比 sparse
编码员更关注这些问题。
【讨论】:
以上是关于Scipy hstack 导致“TypeError:类型不支持转换:(dtype('float64'),dtype('O'))”的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:无法将 <class 'scipy.sparse.csr.csr_matrix'> 类型的对象转换为张量
如何通过索引将 scipy.sparse 矩阵分配给 NumPy 数组?
Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
TypeError:只有一个元素的整数数组可以转换为索引 3