Why do I get the 'loop of ufunc does not support argument 0 of type int' error for numpy.exp?

user2830451 picture user2830451 · Dec 12, 2019 · Viewed 58.2k times · Source

I have a dataframe and I'd like to perform exponential calculation on a subset of rows in a column. I've tried three versions of code and two of them worked. But I don't understand why one version gives me the error.

import numpy as np

Version 1 (working)

np.exp(test * 1.0)

Version 2 (working)

np.exp(test.to_list())

Version 3 (Error)

np.exp(test)

It shows the error below:

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

The test data is generated by:

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

The data in test is just:

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

and its data type is:

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

However, if I try to generate a dummy dataset, it works:

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

Any idea of why I see this error? Thank you very much.

Answer

Yoshiaki picture Yoshiaki · Mar 23, 2020

I just saw your post and would like to answer.

I guess your problem occurs because some numpy functions require float type argument explicity, whereas your such use of the code as np.exp(test) puts int data into the argument.

Solution could be:

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)

Would you check if it works to you? I'd be glad to help.