# Only size-1 arrays can be converted to Python scalars

Numpy is one of the most used module in Python and it is used in a variety of tasks ranging from creating array to mathematical and statistical calculations. Numpy also bring efficiency in Python programming. While using numpy you may encounter this error `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 use `int(x)` but you will get the same error. It is because both `np.int()` and `int(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.  