TypeError: ufunc 'subtract' не содержал петлю с типами соответствия подписи dtype (' <U1') dtype('<U1') dtype('<U1')

Странная ошибка от 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)

Ответ 1

Почему он применяет 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 bins параметр? Что документы говорят bins должны быть?

Ответ 2

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

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)

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

Ответ 3

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

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

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() от третьей до последней строки, а затем записывала в файл. Из вышеизложенного никаких других изменений в код не было.

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

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

Ответ 4

У меня была похожая проблема, когда целое число в ряду кадра данных, по которому я перебирал, было типа "numpy.int64". Я получил сообщение TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U1') dtype('<U1') dtype('<U1') при попытке вычесть из него число с плавающей точкой.

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