Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 524
user2830451 Avatar asked Dec 12 '19 04:12

user2830451


2 Answers

I guess your problem occurs because some NumPy functions explicitly require float-type arguments. Your code np.exp(test), however, has type int.

Try forcing it to be float

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)  
like image 68
Yosher Avatar answered Sep 19 '22 15:09

Yosher


The root cause of the problem was correct in Yoshiaki's 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.

However, his solution didn't work for me so I adjusted it a little bit and got it work for me

your_array = your_array.astype(float) output = np.exp(your_array) 
like image 29
MattiH Avatar answered Sep 21 '22 15:09

MattiH