web-dev-qa-db-fra.com

TypeError: ufunc 'soustraction' ne contenait pas de boucle avec les types de correspondance des signatures

Étrange erreur de numpy via matplotlib lors de l’obtention de l’histogramme d’un jeu de données de jouets minuscule. Je ne sais tout simplement pas comment interpréter l'erreur, ce qui rend difficile de savoir quoi faire ensuite.

Je n'ai pas trouvé beaucoup de liens, cependant cette question nltk et cette question gdsCAD sont superficiellement similaires.

Je souhaite que les informations de débogage en bas soient plus utiles que le code du pilote, mais si j'ai oublié quelque chose, veuillez demander. Ceci est reproductible dans le cadre d'une suite de tests existante.

        if n > 1:
            return diff(a[slice1]-a[slice2], n-1, axis=axis)
        else:
>           return a[slice1]-a[slice2]
E           TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U1') dtype('<U1') dtype('<U1')

../py2.7.11-venv/lib/python2.7/site-packages/numpy/lib/function_base.py:1567: TypeError
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> py2.7.11-venv/lib/python2.7/site-packages/numpy/lib/function_base.py(1567)diff()
-> return a[slice1]-a[slice2]
(Pdb) bt
[...]
py2.7.11-venv/lib/python2.7/site-packages/matplotlib/axes/_axes.py(5678)hist()
-> m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
  py2.7.11-venv/lib/python2.7/site-packages/numpy/lib/function_base.py(606)histogram()
-> if (np.diff(bins) < 0).any():
> py2.7.11-venv/lib/python2.7/site-packages/numpy/lib/function_base.py(1567)diff()
-> return a[slice1]-a[slice2]
(Pdb) p numpy.__version__
'1.11.0'
(Pdb) p matplotlib.__version__
'1.4.3'
(Pdb) a
a = [u'A' u'B' u'C' u'D' u'E']
n = 1
axis = -1
(Pdb) p slice1
(slice(1, None, None),)
(Pdb) p slice2
(slice(None, -1, None),)
(Pdb)
11
Gregory Marton

Pourquoi applique-t-il diff à un tableau de chaînes.

Je reçois une erreur au même moment, mais avec un message différent

In [23]: a=np.array([u'A' u'B' u'C' u'D' u'E'])

In [24]: np.diff(a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-9d5a62fc3ff0> in <module>()
----> 1 np.diff(a)

C:\Users\paul\AppData\Local\Enthought\Canopy\User\lib\site-packages\numpy\lib\function_base.pyc in diff(a, n, axis)
   1112         return diff(a[slice1]-a[slice2], n-1, axis=axis)
   1113     else:
-> 1114         return a[slice1]-a[slice2]
   1115 
   1116 

TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray' 

Ce tableau a est-il le paramètre bins? Qu'est-ce que les docs disent que bins devrait être?

0
hpaulj

J'ai la même erreur, mais dans mon cas, je soustrais dict.key à dict.value. J'ai résolu ce problème en soustrayant dict.value pour la clé correspondante des autres dict.value.

cosine_sim = cosine_similarity(e_b-e_a, w-e_c)

ici, j'ai une erreur parce que e_b, e_a et e_c sont des vecteurs d'intégration pour Word a, b, c Je ne savais pas que 'w' est une chaîne, quand j'ai cherché w est une chaîne, je corrige cela en suivant la ligne: 

cosine_sim = cosine_similarity(e_b-e_a, Word_to_vec_map[w]-e_c)

Au lieu de soustraire dict.key, maintenant j'ai soustrait la valeur correspondante pour la clé

3

Je suis assez nouveau dans ce domaine moi-même, mais j’ai eu une erreur similaire et j’ai découvert qu’elle était due à un problème de transtypage. J'essayais de concaténer plutôt que de prendre la différence mais je pense que le principe est le même ici. J'ai fourni une réponse similaire sur une autre question donc j'espère que c'est OK. 

En substance, vous devez utiliser un type de conversion de données différent. Dans mon cas, j’avais besoin de str non flottant. Je suppose que le vôtre est identique, de sorte que ma solution est proposée. Je suis désolé, je ne peux pas le tester avant de suggérer, mais votre exemple ne montre pas clairement ce que vous faisiez. 

return diff(str(a[slice1])-str(a[slice2]), n-1, axis=axis)

S'il vous plaît voir mon exemple de code ci-dessous pour la correction de mon code, le changement se produit sur la troisième à la dernière ligne. Le code doit produire un modèle de forêt aléatoire de base.

import scipy
import math
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn import preprocessing, metrics, cross_validation

Data = pd.read_csv("Free_Energy_exp.csv", sep=",")
Data = Data.fillna(Data.mean()) # replace the NA values with the mean of the descriptor
header = Data.columns.values # Ues the column headers as the descriptor labels
Data.head()
test_name = "Test.csv"

npArray = np.array(Data)
print header.shape
npheader = np.array(header[1:-1])
print("Array shape X = %d, Y = %d " % (npArray.shape))
datax, datay =  npArray.shape

names = npArray[:,0]
X = npArray[:,1:-1].astype(float)
y = npArray[:,-1] .astype(float)
X = preprocessing.scale(X)

XTrain, XTest, yTrain, yTest = cross_validation.train_test_split(X,y, random_state=0)

# Predictions results initialised 
RFpredictions = []
RF = RandomForestRegressor(n_estimators = 10, max_features = 5, max_depth = 5, random_state=0)
RF.fit(XTrain, yTrain)       # Train the model
print("Training R2 = %5.2f" % RF.score(XTrain,yTrain))
RFpreds = RF.predict(XTest)

with open(test_name,'a') as fpred :
    lenpredictions = len(RFpreds)
    lentrue = yTest.shape[0]
    if lenpredictions == lentrue :
            fpred.write("Names/Label,, Prediction Random Forest,, True Value,\n")
            for i in range(0,lenpredictions) :
                    fpred.write(RFpreds[i]+",,"+yTest[i]+",\n")
    else :
            print "ERROR - names, prediction and true value array size mismatch."

Cela conduit à une erreur de;

Traceback (most recent call last):
  File "min_example.py", line 40, in <module>
    fpred.write(RFpreds[i]+",,"+yTest[i]+",\n")
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32')

La solution consiste à attribuer à chaque variable un type str () sur la troisième à la dernière ligne, puis une écriture dans un fichier. Aucune autre modification du code ci-dessus n'a été apportée.

import scipy
import math
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn import preprocessing, metrics, cross_validation

Data = pd.read_csv("Free_Energy_exp.csv", sep=",")
Data = Data.fillna(Data.mean()) # replace the NA values with the mean of the descriptor
header = Data.columns.values # Ues the column headers as the descriptor labels
Data.head()
test_name = "Test.csv"

npArray = np.array(Data)
print header.shape
npheader = np.array(header[1:-1])
print("Array shape X = %d, Y = %d " % (npArray.shape))
datax, datay =  npArray.shape

names = npArray[:,0]
X = npArray[:,1:-1].astype(float)
y = npArray[:,-1] .astype(float)
X = preprocessing.scale(X)

XTrain, XTest, yTrain, yTest = cross_validation.train_test_split(X,y, random_state=0)

# Predictions results initialised 
RFpredictions = []
RF = RandomForestRegressor(n_estimators = 10, max_features = 5, max_depth = 5, random_state=0)
RF.fit(XTrain, yTrain)       # Train the model
print("Training R2 = %5.2f" % RF.score(XTrain,yTrain))
RFpreds = RF.predict(XTest)

with open(test_name,'a') as fpred :
    lenpredictions = len(RFpreds)
    lentrue = yTest.shape[0]
    if lenpredictions == lentrue :
            fpred.write("Names/Label,, Prediction Random Forest,, True Value,\n")
            for i in range(0,lenpredictions) :
                    fpred.write(str(RFpreds[i])+",,"+str(yTest[i])+",\n")
    else :
            print "ERROR - names, prediction and true value array size mismatch."

Ces exemples proviennent d'un code plus large, j'espère que les exemples sont suffisamment clairs.

2
James

J'ai eu un problème similaire où un entier dans une rangée d'une base de données sur laquelle je parcourais était de type 'numpy.int64'. J'ai eu le "TypeError: ufunc 'soustraction' ne contenait pas de boucle avec les types de correspondance de signature dtype ('

La solution la plus simple pour moi était de convertir la ligne à l'aide de pd.to_numeric (row)

1
colster