web-dev-qa-db-ja.com

インデックスとして使用される配列は、整数(またはブール)タイプでなければなりません

エラーは次のとおりです。

_Traceback (most recent call last):
  File "NearestCentroid.py", line 53, in <module>
    clf.fit(X_train.todense(),y_train)
  File "/usr/local/lib/python2.7/dist-packages/scikit_learn-0.13.1-py2.7-linux-i686.Egg/sklearn/neighbors/nearest_centroid.py", line 115, in fit
    variance = np.array(np.power(X - self.centroids_[y], 2))
IndexError: arrays used as indices must be of integer (or boolean) type
_

コードは次のとおりです。

_distancemetric=['euclidean','l2']
for mtrc in distancemetric:
for shrkthrshld in [None]:
#shrkthrshld=0
#while (shrkthrshld <=1.0):
    clf = NearestCentroid(metric=mtrc,shrink_threshold=shrkthrshld)
    clf.fit(X_train.todense(),y_train)
    y_predicted = clf.predict(X_test.todense())
_

私は_scikit-learn_パッケージを使用しています、_X-train_、_y_train_はLIBSVM形式です、Xは機能と値のペア、_y_train_はターゲット/ラベル、 _X_train_はCSRマトリックス形式であり、_shrink_threshold_はCSRスパースマトリックスをサポートしていないため、.todense()を_X_train_に追加すると、このエラーが発生し、だれでも助けることができます私はこれを修正しますか?どうもありがとう!

13
user1710418

Pystruct pystruct.learners.OneSlackSSVMを使用して同様の問題が発生しました。

これは、トレーニングラベルが整数ではなく浮動小数点だったために発生しました。私の場合は、dtype = np.int8を指定せずにnp.onesでラベルを初期化したためです。それが役に立てば幸い。

32
FaXilifresh

インデックス配列は、作成方法によって明らかにinteger型であることがよくありますが、渡された空のリストの場合、デフォルトのfloatと見なされます。これは考慮されない場合があります。プログラマによって。例えば:

>>> np.array(xrange(1))
>>> array([0])                #integer type as expected
>>> np.array(xrange(0))
>>> array([], dtype=float64)  #does not generalize to the empty list

したがって、配列コンストラクタで常に明示的にdtypeを定義する必要があります。

5

時々あなたのデータは整数であり、すべてが正しいですが、それはあなたのデータ系列の一つが空の配列であるので起こりました、それであなたはこの条件を使うことができます:

if len(X_train.todense())> 0:
0
yasi