# TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array

I want to write a function that randomly picks elements from a training set, based on the bin probabilities provided. I divide the set indices to 11 bins, then create custom probabilities for them.

``````bin_probs = [0.5, 0.3, 0.15, 0.04, 0.0025, 0.0025, 0.001, 0.001, 0.001, 0.001, 0.001]

X_train = list(range(2000000))

train_probs = bin_probs * int(len(X_train) / len(bin_probs)) # extend probabilities across bin elements
train_probs.extend([0.001]*(len(X_train) - len(train_probs))) # a small fix to match number of elements
train_probs = train_probs/np.sum(train_probs) # normalize
indices = np.random.choice(range(len(X_train)), replace=False, size=50000, p=train_probs)
out_images = X_train[indices.astype(int)] # this is where I get the error
``````

I get the following error:

``````TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array
``````

I find this weird, since I already checked the array of indices that I have created. It is 1-D, it is integer, and it is scalar.

What am I missing?

Note : I tried to pass `indices` with `astype(int)`. Same error.

## Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

### Solution 1

Perhaps the error message is somewhat misleading, but the gist is that `X_train` is a list, not a numpy array. You cannot use array indexing on it. Make it an array first:

``````out_images = np.array(X_train)[indices.astype(int)]
``````

### Solution 2

I get this error whenever I use `np.concatenate` the wrong way:

``````>>> a = np.eye(2)
>>> np.concatenate(a, a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in concatenate
TypeError: only integer scalar arrays can be converted to a scalar index
``````

The correct way is to input the two arrays as a tuple:

``````>>> np.concatenate((a, a))
array([[1., 0.],
[0., 1.],
[1., 0.],
[0., 1.]])
``````

### Solution 3

A simple case that generates this error message:

``````In : [1,2,3,4,5][np.array()]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-55def8e1923d> in <module>()
----> 1 [1,2,3,4,5][np.array()]

TypeError: only integer scalar arrays can be converted to a scalar index
``````

Some variations that work:

``````In : [1,2,3,4,5][np.array(1)]     # this is a 0d array index
Out: 2
In : [1,2,3,4,5][np.array().item()]
Out: 2
In : np.array([1,2,3,4,5])[np.array()]
Out: array()
``````

Basic python list indexing is more restrictive than numpy’s:

``````In : [1,2,3,4,5][]
....
TypeError: list indices must be integers or slices, not list
``````

#### edit

Looking again at

``````indices = np.random.choice(range(len(X_train)), replace=False, size=50000, p=train_probs)
``````

`indices` is a 1d array of integers – but it certainly isn’t scalar. It’s an array of 50000 integers. List’s cannot be indexed with multiple indices at once, regardless of whether they are in a list or array.

### Solution 4

Another case that could cause this error is

``````>>> np.ndindex(np.random.rand(60,60))
TypeError: only integer scalar arrays can be converted to a scalar index
``````

Using the actual shape will fix it.

``````>>> np.ndindex(np.random.rand(60,60).shape)
<numpy.ndindex object at 0x000001B887A98880>
``````

### Solution 5

Check that you’re passing the right arguments. Similar to Simon, I was passing two arrays to `np.all` when it only accepted one array, meaning that the second array was interpreted to be an axis.

### Solution 6

Try to use x_train.shape[] instead.

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0