web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens l'erreur «boucle d'ufunc ne prend pas en charge l'argument 0 de type int» pour numpy.exp?

J'ai une trame de données et je voudrais effectuer un calcul exponentiel sur un sous-ensemble de lignes dans une colonne. J'ai essayé trois versions de code et deux d'entre elles ont fonctionné. Mais je ne comprends pas pourquoi une version me donne l'erreur.

import numpy as np

Version 1 (fonctionne)

np.exp(test * 1.0)

Version 2 (fonctionne)

np.exp(test.to_list())

Version 3 (erreur)

np.exp(test)

Il montre l'erreur ci-dessous:

AttributeError                            Traceback (most recent call last)
AttributeError: 'int' object has no attribute 'exp'

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
<ipython-input-161-9d5afc93942c> in <module>()
----> 1 np.exp(pd_feature.loc[(pd_feature[col] > 0) & (pd_feature[col] < 700), col])

TypeError: loop of ufunc does not support argument 0 of type int which has no callable exp method

Les données de test sont générées par:

test = pd.loc[(pd['a'] > 0) & (pd['a'] < 650), 'a']

Les données testées sont simplement:

0      600
2      600
42     600
43     600
47     600
60     600
67     600
Name: a, dtype: Int64

et son type de données est:

<class 'pandas.core.series.Series'>

Cependant, si j'essaie de générer un jeu de données factice, cela fonctionne:

data = {'a':[600, 600, 600, 600, 600, 600, 600], 'b': ['a', 'a', 'a', 'a', 'a', 'a', 'a']} 

df = pd.DataFrame(data) 

np.exp(df.loc[:,'a'])

Une idée de pourquoi je vois cette erreur? Merci beaucoup.

4
user2830451

Je viens de voir votre message et je voudrais répondre.

Je suppose que votre problème se produit car certaines fonctions numpy nécessitent float type explicite, alors que votre utilisation du code comme np.exp(test) place int données dans l'argument.

La solution pourrait être:

import numpy as np

your_array = your_array.float()
output = np.exp(your_array)

# OR

def exp_test(x)
  x.float()
  return np.exp(x)

output = exp_test(your_array)

Pourriez-vous vérifier si cela vous convient? Je serais ravi de vous aider.

1
Yoshiaki