TypeError: ufunc 'subtract' не содержит цикла с типами dtype, соответствующими сигнатуре ('

странная ошибка от numpy через matplotlib при попытке получить гистограмму крошечного набора данных игрушек. Я просто не уверен, как интерпретировать ошибку, что затрудняет понимание того, что делать дальше.

не нашел много связано, хотя этот вопрос nltk и этот вопрос gdsCAD внешне похожи.

Я намереваюсь отладочная информация внизу быть более полезной, чем код драйвера, но если я что-то пропустил, пожалуйста, спросите. Это воспроизводимый как часть существующего набора тестов.

        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)

4 ответов


почему он применяется diff к массиву строк.

я получаю ошибку в тот же момент, хотя и с другим сообщением

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' 

это a массива


Я получил ту же ошибку, но в моем случае я вычитаю дикт.ключ от дикт.значение. Я исправил это, вычитая dict.значение для соответствующего ключа из другого dict.значение.

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

здесь я получил ошибку, потому что e_b, e_a и e_c встраивают вектор для слова A,b,c соответственно. Я не знал, что " w " - строка, когда я искал W-строку, я исправляю это следующей строкой:

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

вместо вычитания дикт.ключ, теперь я вычитал соответствующий значение для ключа


Я сам довольно новичок в этом, но у меня была аналогичная ошибка и обнаружил, что это связано с проблемой кастинга типа. Я пытался объединить, а не взять разницу, но я думаю, что принцип здесь тот же. Я дал аналогичный ответ на другой вопрос поэтому я надеюсь, что все в порядке.

по сути, вам нужно использовать другой тип данных, в моем случае мне нужен str не float, я подозреваю, что ваш такой же, поэтому мое предлагаемое решение. Прости, я не могу проверить. это прежде, чем предлагать, но я неясен из вашего примера, что вы делали.

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

пожалуйста, см. мой пример кода ниже для исправления моего кода, изменение происходит с третьей по последнюю строку. Код предназначен для создания базовой модели случайного леса.

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."

это приводит к ошибке;

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')

решение состоит в том, чтобы сделать каждую переменную типом str() в третьей-последней строке, а затем записать в файл. Никаких других изменений в коде then не было сделано из выше.

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."

эти примеры взяты из большего кода, поэтому я надеюсь, что примеры достаточно ясны.


У меня была аналогичная проблема, когда целое число в строке фрейма данных, над которым я перебирал, было типа ' numpy.int64'. Я получил "TypeError: ufunc "вычитание" не содержало цикла с типами соответствия подписи dtype('

самым простым решением для меня было преобразовать строку с помощью pd.to_numeric (строка)