Numpy hstack - “ValueError:所有输入数组必须具有相同的维数” - 但它们确实如此
Posted
技术标签:
【中文标题】Numpy hstack - “ValueError:所有输入数组必须具有相同的维数” - 但它们确实如此【英文标题】:Numpy hstack - "ValueError: all the input arrays must have same number of dimensions" - but they do 【发布时间】:2014-04-11 01:22:51 【问题描述】:我正在尝试加入两个 numpy 数组。在一个文本列上运行 TF-IDF 后,我有一组列/功能。在另一个我有一个列/特征是一个整数。所以我读入了一列训练和测试数据,对此运行 TF-IDF,然后我想添加另一个整数列,因为我认为这将帮助我的分类器更准确地了解它应该如何表现。
不幸的是,当我尝试运行 hstack
将此单列添加到我的另一个 numpy 数组时,我在标题中遇到错误。
这是我的代码:
#reading in test/train data for TF-IDF
traindata = list(np.array(p.read_csv('FinalCSVFin.csv', delimiter=";"))[:,2])
testdata = list(np.array(p.read_csv('FinalTestCSVFin.csv', delimiter=";"))[:,2])
#reading in labels for training
y = np.array(p.read_csv('FinalCSVFin.csv', delimiter=";"))[:,-2]
#reading in single integer column to join
AlexaTrainData = p.read_csv('FinalCSVFin.csv', delimiter=";")[["alexarank"]]
AlexaTestData = p.read_csv('FinalTestCSVFin.csv', delimiter=";")[["alexarank"]]
AllAlexaAndGoogleInfo = AlexaTestData.append(AlexaTrainData)
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) #tf-idf object
rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001,
C=1, fit_intercept=True, intercept_scaling=1.0,
class_weight=None, random_state=None) #Classifier
X_all = traindata + testdata #adding test and train data to put into tf-idf
lentrain = len(traindata) #find length of train data
tfv.fit(X_all) #fit tf-idf on all our text
X_all = tfv.transform(X_all) #transform it
X = X_all[:lentrain] #reduce to size of training set
AllAlexaAndGoogleInfo = AllAlexaAndGoogleInfo[:lentrain] #reduce to size of training set
X_test = X_all[lentrain:] #reduce to size of training set
#printing debug info, output below :
print "X.shape => " + str(X.shape)
print "AllAlexaAndGoogleInfo.shape => " + str(AllAlexaAndGoogleInfo.shape)
print "X_all.shape => " + str(X_all.shape)
#line we get error on
X = np.hstack((X, AllAlexaAndGoogleInfo))
下面是输出和错误信息:
X.shape => (7395, 238377)
AllAlexaAndGoogleInfo.shape => (7395, 1)
X_all.shape => (10566, 238377)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-12-2b310887b5e4> in <module>()
31 print "X_all.shape => " + str(X_all.shape)
32 #X = np.column_stack((X, AllAlexaAndGoogleInfo))
---> 33 X = np.hstack((X, AllAlexaAndGoogleInfo))
34 sc = preprocessing.StandardScaler().fit(X)
35 X = sc.transform(X)
C:\Users\Simon\Anaconda\lib\site-packages\numpy\core\shape_base.pyc in hstack(tup)
271 # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
272 if arrs[0].ndim == 1:
--> 273 return _nx.concatenate(arrs, 0)
274 else:
275 return _nx.concatenate(arrs, 1)
ValueError: all the input arrays must have same number of dimensions
是什么导致了我的问题?我怎样才能解决这个问题?据我所见,我应该能够加入这些专栏吗?我误会了什么?
谢谢。
编辑:
使用下面答案中的方法得到以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-16-640ef6dd335d> in <module>()
---> 36 X = np.column_stack((X, AllAlexaAndGoogleInfo))
37 sc = preprocessing.StandardScaler().fit(X)
38 X = sc.transform(X)
C:\Users\Simon\Anaconda\lib\site-packages\numpy\lib\shape_base.pyc in column_stack(tup)
294 arr = array(arr,copy=False,subok=True,ndmin=2).T
295 arrays.append(arr)
--> 296 return _nx.concatenate(arrays,1)
297
298 def dstack(tup):
ValueError: all the input array dimensions except for the concatenation axis must match exactly
有趣的是,我尝试打印 X 的 dtype
,效果很好:
X.dtype => float64
但是,尝试像这样打印AllAlexaAndGoogleInfo
的dtype:
print "AllAlexaAndGoogleInfo.dtype => " + str(AllAlexaAndGoogleInfo.dtype)
产生:
'DataFrame' object has no attribute 'dtype'
【问题讨论】:
allAlexaAndGoogleInfo.append(X)
有效吗?我的猜测是,如果要将DataFrame
对象与numpy.ndarray
结合起来,则需要使用 Pandas 提供的方法。或者将 DataFrame
转换为普通的 numpy
数组。
【参考方案1】:
由于X
是一个稀疏数组,而不是numpy.hstack
,所以使用scipy.sparse.hstack
加入数组。在我看来,错误信息在这里有点误导。
这个最小的例子说明了这种情况:
import numpy as np
from scipy import sparse
X = sparse.rand(10, 10000)
xt = np.random.random((10, 1))
print 'X shape:', X.shape
print 'xt shape:', xt.shape
print 'Stacked shape:', np.hstack((X,xt)).shape
#print 'Stacked shape:', sparse.hstack((X,xt)).shape #This works
基于以下输出
X shape: (10, 10000)
xt shape: (10, 1)
人们可能认为下一行中的hstack
会起作用,但事实是它会引发此错误:
ValueError: all the input arrays must have same number of dimensions
所以,当你有一个稀疏数组要堆叠时,使用scipy.sparse.hstack
。
事实上我已经在你的另一个问题中作为评论回答了这个问题,你提到弹出另一个错误消息:
TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))
首先,AllAlexaAndGoogleInfo
没有dtype
,因为它是DataFrame
。要获得它的底层 numpy 数组,只需使用 AllAlexaAndGoogleInfo.values
。检查其dtype
。根据错误消息,它有一个object
的dtype
,这意味着它可能包含字符串等非数字元素。
这是重现这种情况的最小示例:
X = sparse.rand(100, 10000)
xt = np.random.random((100, 1))
xt = xt.astype('object') # Comment this to fix the error
print 'X:', X.shape, X.dtype
print 'xt:', xt.shape, xt.dtype
print 'Stacked shape:', sparse.hstack((X,xt)).shape
错误信息:
TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))
所以,在进行堆叠之前,检查AllAlexaAndGoogleInfo
中是否有任何非数值并修复它们。
【讨论】:
np.hstack
能够强制类型,例如np.hstack((X.A,xt))
工作,产生一个具有 dtype 对象的数组。 sparse.hstack
也适用于显式转换数组,例如sparse.hstack((X.astype(object), xt))
OMFG 在我看到这个之前,我正在拉我的头发并敲打我的头。谢谢!【参考方案2】:
使用.column_stack
。像这样:
X = np.column_stack((X, AllAlexaAndGoogleInfo))
来自docs:
获取一维数组的序列并将它们堆叠为列以生成 单个二维阵列。二维数组按原样堆叠,就像 hstack 一样。
【讨论】:
感谢您的回复。我已经更新了上面的问题以显示由此产生的错误消息。 3str(*.shape)
行的输出是什么?
如果上面的标记变得烦人,那就是我在上面发布的问题,但输出是:X.shape => (7395, 238377)
、AllAlexaAndGoogleInfo.shape => (7395, 1)
和 X_all.shape => (10566, 238377)
。谢谢:)
尝试X.resize(AllAlexaAndGoogleInfo.shape)
然后X = np.hstack((X, AllAlexaAndGoogleInfo))
。
这一行然后抛出错误AttributeError: resize not found
。谢谢你的想法! :)【参考方案3】:
试试:
X = np.hstack((X, AllAlexaAndGoogleInfo.values))
我没有正在运行的 Pandas 模块,因此无法对其进行测试。但是 DataFrame 文档描述了values Numpy representation of NDFrame
。 np.hstack
是一个numpy
函数,因此对DataFrame
的内部结构一无所知。
【讨论】:
感谢您的回复,不幸的是,这也成为了受害者:ValueError: all the input arrays must have same number of dimensions
:(
我试图打印这个;但我相信 pandas 将其作为 DataFrame 对象读入,因此它会抛出错误“'DataFrame' object has no attribute 'dtype''。我不确定如何解决这个问题。非常感谢您的帮助:)
但是没有办法获得那个DataFrame的ndarray
表达式吗?从文档来看,values
会这样做。还有一个“as_matrix”方法。 ftypes
呢?我还在文档中看到了dtypes
。 DataFrame 可能包含ndarray
,但它本身不是ndarray
。以上是关于Numpy hstack - “ValueError:所有输入数组必须具有相同的维数” - 但它们确实如此的主要内容,如果未能解决你的问题,请参考以下文章
Python使用numpy中的hstack函数水平堆叠(horizontally stack)数组实战
Numpy 中 np.vstack() 和 np.hstack() 简单解析
OpenCV 函数学习10-图像的拼接(np.hstack)
Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)