web-dev-qa-db-ja.com

TypeError:整数スカラー配列のみが1D numpyインデックス配列を持つスカラーインデックスに変換できます

トレーニングセットから要素をランダムに選択する関数を作成しますが、提供された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を渡そうとしました。同じエラー。

10
3yanlis1bos

おそらくエラーメッセージはやや誤解を招くかもしれませんが、要点はX_trainがnumpy配列ではなくリストであることです。配列のインデックスを使用することはできません。最初に配列にします:

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

このエラーメッセージを生成する簡単なケース:

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整数の配列です。リストは、リストまたは配列にあるかどうかに関係なく、複数のインデックスで一度にインデックスを作成することはできません。

2
hpaulj