TypeError: 只有整数标量数组可以转换为具有1D 数字索引数组的标量索引

我想编写一个函数,根据提供的 垃圾桶概率从训练集中随机挑选元素。然后为它们创建 自定义概率

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

我得到以下错误:

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

我发现这很奇怪,因为我已经检查了我创建的索引数组。它是 1-D,它是 整数,它是 标量

我错过了什么?

注意: 我试图用 astype(int)传递 indices。同样的错误。

569716 次浏览

也许错误消息有些误导,但要点是 X_train是一个列表,而不是一个数字数组。不能对其使用数组索引。首先将其设置为数组:

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

生成此错误消息的一个简单示例:

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


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

一些有效的变化:

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

基本的 python 列表索引比 numpy 的限制更多:

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

编辑

再看看

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

indices是一个1d 的整数数组,但它肯定不是标量。它是一个包含50000个整数的数组。列表的索引不能同时使用多个索引,无论它们是在列表中还是在数组中。

每当我以错误的方式使用 np.concatenate时,我都会得到这个错误:

>>> 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

正确的方法是以元组的形式输入这两个数组:

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

可能导致此错误的另一种情况是

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

使用实际的形状将修复它。

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

检查传递的参数是否正确。与 西蒙类似,当 np.all只接受一个数组时,我将两个数组传递给 np.all,这意味着第二个数组被解释为一个轴。

尝试使用 x _ train. form []代替。