TypeError: only size-1 arrays can be converted to Python scalars
It is one of the frequently appearing error and sometimes it becomes a daunting challenge to solve it.
Meaning : Only Size 1 Arrays Can Be Converted To Python Scalars Error
This error generally appears when Python expects a single value but you passed an array which consists of multiple values. For example : you want to calculate exponential value of an array but the function for exponential value was designed for scalar variable (which means single value). When you pass numpy array in the function, it will return this error. This error handling is to prevent your code to process further and avoids unexpected output from the function later.There are 5 method to solve this error
Solutions with examples
Create Reproducible Example
Let's understand the issue with an example. Suppose you have an array consisting of decimals values and your manager asked you to convert it into integer.Let's create a numpy array having decimals (float)
import numpy as np x = np.array([2, 3.5, 4, 5.3, 27])Let's convert to integer values (without decimals)
np.int(x)
TypeError: only size-1 arrays can be converted to Python scalars
np.int()
is deprecated alias so you can simply useint(x)
but you will get the same error. It is because bothnp.int()
andint(x)
only accepts a single value not multiple values storing in an array. In other words you passed an array instead of scalar variable
Solution 1 : Using .astype()
method
In order to convert a NumPy array of float values to integer values, we can instead use the following code:
x.astype(int)Output
array([ 2, 3, 4, 5, 27])3.5 and 5.3 from the original array has been converted to 3 and 5.
In order to reflect changes in x
array, use the code below :
x = x.astype(int)
Solution 2 : Using np.vectorize()
Another possible solution is to use np.vectorize()
instead of .astype()
. But note that this is not efficient as compared to the prior solution.
convert2Integer = np.vectorize(int)
convert2Integer(x)
Solution 3 : Using map
By using map
we can apply int()
function over each array element. In map , we need to pass the two arguments - function and array which we want to convert.
np.array(list(map(int, x)))
Solution 4 : Using loop
It's easy to understand loop and you have flexibility over each element in terms of data manipulation. But it is not necessarily an efficient method. Also it involves writing extra lines of code which can be solved in a single line.
We created helper array y having similar length that array x has. Later we converted each element via int()
function.
l = len(x) y = np.array([None]*l) for i in range(l): y[i] = int(x[i]) print(y)
Solution 5 : Using apply_along_axis
Apply_along_axis
lets you to apply int()
to numpy array.
l = lambda y: [int(i) for i in y] np.apply_along_axis(l, 0, x)
Another Example
Suppose you need to calculate log value of an array.
import numpy as np import math x = np.array([2, 3, 1]) math.log(x)
TypeError: only size-1 arrays can be converted to Python scalars
This error occured because math.log(x)
can only take one numeric value. Here you can use np.log(x)
Output
array([0.69314718, 1.09861229, 0])You can also fix it using
np.vectorize(math.log)
. See the complete solution below.
logMultiple = np.vectorize(math.log)
logMultiple(x)
Conclusion
Hope you understood now how to solve this error. The above solutions are intended to give you an idea how the problem can be solved in multiple ways but solution 1 is enough to solve your problem. If you have any question(s) regarding this error, please feel free to post in the comment section.
Share Share Tweet