我想编写一个函数,该函数可以从提供的 bin概率中随机选择训练集中的元素。我将设置的索引划分为11个bin ,然后为其创建自定义概率。
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 ,它是整数,并且是标量。
我想念什么?
注意:我尝试将indices
与astype(int)
一起传递。同样的错误。
答案 0 :(得分:25)
每当我以错误的方式使用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.]])
答案 1 :(得分:12)
错误消息可能在某种程度上具有误导性,但是要点是X_train
是一个列表,而不是一个numpy数组。您不能在其上使用数组索引。首先将其设置为数组:
out_images = np.array(X_train)[indices.astype(int)]
答案 2 :(得分:1)
生成此错误消息的简单情况:
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
是一维整数数组-但它当然不是标量。它是50000个整数的数组。列表不能一次用多个索引建立索引,无论它们是在列表中还是在数组中。
答案 3 :(得分:0)
另一种可能导致此错误的情况是
>>> 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>
答案 4 :(得分:0)
检查您传递的参数是否正确。与 Simon 类似,当 np.all
只接受一个数组时,我将两个数组传递给它,这意味着第二个数组被解释为一个轴。