トレーニングセットから要素をランダムに選択する関数を作成しますが、提供されたbin確率に基づきます。 Iセットインデックスを11ビンに分割し、次にカスタム確率を作成しますそれら。
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、それはinteger、およびscalarです。
私は何が欠けていますか?
注:astype(int)
でindices
を渡そうとしました。同じエラー。
おそらくエラーメッセージはやや誤解を招くかもしれませんが、要点はX_train
がnumpy配列ではなくリストであることです。配列のインデックスを使用することはできません。最初に配列にします:
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
は整数の1次元配列ですが、確かにスカラーではありません。 50000整数の配列です。リストは、リストまたは配列にあるかどうかに関係なく、複数のインデックスで一度にインデックスを作成することはできません。