Numpy hstack - “ValueError: tous les tableaux doivent avoir le même nombre de dimensions” -, mais ils ne
J'essaie de joindre les deux tableaux numpy. Dans l'un j'ai un ensemble de colonnes/fonctionnalités après l'exécution de TF-IDF sur une seule colonne de texte. Dans l'autre, j'ai une colonne/caractéristique qui est un entier. J'ai donc lu dans une colonne de train et les données de test, exécution TF-IDF sur ce, et puis je veux ajouter une autre colonne de type integer, car je pense que cela va aider mon classificateur en savoir plus précisément comment il doit se comporter.
Malheureusement, j'obtiens l'erreur dans le titre, lorsque j'essaie de l'exécuter hstack
pour ajouter cette seule colonne de mon tableau numpy.
Voici mon code :
#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'\w{1,}',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))
Ci-dessous est la sortie et le message d'erreur :
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
Quelle est la cause de mon problème ici? Comment puis-je résoudre ce problème? Aussi loin que je peux voir, je devrais être en mesure de se joindre à ces colonnes? Qu'ai-je mal compris?
Merci.
Edit :
À l'aide de la méthode dans la réponse ci-dessous obtient l'erreur suivante :
---------------------------------------------------------------------------
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
Fait intéressant, j'ai essayé d'imprimer la dtype
de X et cela a bien fonctionné :
X.dtype => float64
Cependant, en essayant d'imprimer la dtype de AllAlexaAndGoogleInfo
comme suit :
print "AllAlexaAndGoogleInfo.dtype => " + str(AllAlexaAndGoogleInfo.dtype)
produit :
'DataFrame' object has no attribute 'dtype'
allAlexaAndGoogleInfo.append(X)
travail? Ma conjecture est que si vous voulez combiner DataFrame
objet avec une numpy.ndarray
, vous devez utiliser les méthodes fournies par les Pandas. Ou à convertir le DataFrame
à une plaine numpy
tableau.OriginalL'auteur Simon Kiely | 2014-03-07
Vous devez vous connecter pour publier un commentaire.
Comme
X
est un tableau fragmenté, au lieu denumpy.hstack
, utilisezscipy.sparse.hstack
pour rejoindre les tableaux. À mon avis, le message d'erreur est le genre d'induire en erreur ici.Ce minime exemple illustre bien la situation:
Basé sur la sortie suivante
on peut s'attendre à ce que la
hstack
dans la ligne suivante de travail, mais le fait est qu'il met cette erreur:Ainsi, l'utilisation de
scipy.sparse.hstack
lorsque vous avez un tableau fragmenté à pile.En fait, j'ai répondu à cette question, un commentaire dans un autre de vos questions, et vous avez mentionné qu'un autre message d'erreur apparaît:
Tout d'abord,
AllAlexaAndGoogleInfo
ne dispose pas d'undtype
que c'est unDataFrame
. Pour l'obtenir sous-jacent d'un tableau numpy, il suffit d'utiliserAllAlexaAndGoogleInfo.values
. Vérifier sondtype
. Basé sur le message d'erreur, il a undtype
deobject
, ce qui signifie qu'il peut contenir des non-numérique des éléments comme des chaînes de caractères.C'est un exemple minimal qui reproduit cette situation:
Le message d'erreur:
Donc, vérifiez s'il ya une non-valeurs numériques dans
AllAlexaAndGoogleInfo
et de les réparer, avant de faire l'empilement.np.hstack
est en mesure de contraindre les types, par exemplenp.hstack((X.A,xt))
œuvres, en produisant un tableau avec dtype objet.sparse.hstack
fonctionne également si vous convertir explicitement les matrices, par exemplesparse.hstack((X.astype(object), xt))
OMFG j'étais tirant sur mes cheveux et de se taper ma tête avant que je l'ai vu. Merci!!!!
OriginalL'auteur YS-L
Utilisation
.column_stack
. Comme:De la docs:
Qu'est-ce que la sortie de la 3
str(*.shape)
lignes?C'est dans la question que j'ai posté ci-dessus si le balisage sur ce est ennuyeux, mais la sortie est :
X.shape => (7395, 238377)
,AllAlexaAndGoogleInfo.shape => (7395, 1)
etX_all.shape => (10566, 238377)
. Merci 🙂Essayez
X.resize(AllAlexaAndGoogleInfo.shape)
puisX = np.hstack((X, AllAlexaAndGoogleInfo))
.Cette ligne puis lève l'erreur
AttributeError: resize not found
. Merci pour l'idée! 🙂OriginalL'auteur Drewness
Essayer:
Je n'ai pas l'exécution de Pandas module, ne peut donc pas tester. Mais le DataFrame documentation décrit
values Numpy representation of NDFrame
.np.hstack
est unnumpy
fonction, et en tant que telle ne sait rien à propos de la structure interne de laDataFrame
.ValueError: all the input arrays must have same number of dimensions
🙁Quelle est la dtype et la forme de
All....values
?J'ai essayé d'imprimer cette; mais je crois que les pandas se lit comme un DataFrame objet de sorte qu'il envoyait le message d'erreur ` 'DataFrame" objet n'a pas d'attribut "dtype". Je ne suis pas sûr de la façon de contourner ce problème. Merci beaucoup pour votre aide 🙂
Mais n'est-ce pas là une façon d'obtenir un
ndarray
expression de cette DataFrame? À partir de la documentation, il ressemblait àvalues
le ferait. Il y a aussi un as_matrix " la méthode. Qu'en estftypes
? Je vois aussidtypes
dans la documentation. Un DataFrame peut contenir unendarray
, mais il n'est pas lui-même unndarray
.OriginalL'auteur hpaulj