2017-01-11 9 views
0

以下のコードは、次の値のエラーを生成します。"ValueError:オペランドを一緒にブロードキャストできませんでした"

ValueError: operands could not be broadcast together with shapes (8,8) (64,) 
私は10枚の画像からインタプリタが、私はの1ので、これらのデータポイント上の任意の座標単位の演算を実行することができないことを私に言っているように見える100に設定された「トレーニング」のデータを展開したときには、最初に発生した

座標ペアに値がありません。私はそれで議論することはできません。残念ながら、私の回避策は正確には機能していません。 if条件に続けてcontinueステートメントを挿入しようとしました(つまり、この特定の座標が現れた場合は、ループの先頭から継続する必要があります)。通訳者はこの考えが気に入らず、私が思っていたように、その声明の真実が切り詰めて乾燥していないということについて何かを中断しました。私はa.any()またはa.all()を試してみることを提案しました。私は両方の例を調べ、問題のある座標の組を括弧内に置き、 "a"の代わりに置いてみました。どちらのアプローチも私をどこにも連れてこなかった。私は、Cで特定の基準を満たさない入力を除外するために使用する関数に似たPython関数を認識していません。同様の問題に関連する他の答えは、使用する数学を変更することを推奨しますが、これは私が進めるべき方法であると言われましたので、エラー処理の問題として検討しています。

この問題をどのように処理するかについての洞察はありますか?どんな考えでも大歓迎です!

は、ここでは、コードです:あなたは、エラーが発生する私たちを表示する必要が

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn import datasets 

digits = datasets.load_digits() 
#print the 0th image in the image database as an integer matrix 
print(digits.images[0]) 
#plot the 0th image in the database assigning each pixel an intensity of black 
plt.figure() 
plt.imshow(digits.images[0], cmap = plt.cm.gray_r, interpolation = 'nearest') 
plt.show() 
#create training subsets of images and targets(labels) 
X_train = digits.images[0:1000] 
Y_train = digits.target[0:1000] 
#pick a test point from images (345) 
X_test = digits.images[345] 
#view test data point 
plt.figure() 
plt.imshow(digits.images[345], cmap = plt.cm.gray_r, interpolation = 'nearest') 
plt.show() 
#distance 
def dist(x, y): 
    return np.sqrt(np.sum((x - y)**2)) 

#expand set of test data 
num = len(X_train) 
no_errors = 0 
distance = np.zeros(num) 
for j in range(1697, 1797): 
    X_test = digits.data[j] 
    for i in range(num): 
     distance[i] = dist(X_train[i], X_test) 
    min_index = np.argmin(distance) 
    if Y_train[min_index] != digits.target[j]: 
     no_errors += 1 
print(no_errors) 

答えて

1

、およびエラー・スタックの一部。

次に、問題の原因となっているアレイを特定し、その形状を調べる必要があります。実際にこのエラーは私たちにそれを示しています。 1つのオペランドは8×8の2次元配列です。もう1つは同じ数の要素を持ちますが、1dの形をしています。いくつかの変数を自分のコードに戻す必要があるかもしれません。

だけの問題で説明するために:2つの配列が同じ数の要素を有しているので

In [381]: x = np.ones((8,8),int) 
In [384]: y = np.arange(64) 
In [385]: x*y 
... 
ValueError: operands could not be broadcast together with shapes (8,8) (64,) 
In [386]: x[:] = y 
... 
ValueError: could not broadcast input array from shape (64) into shape (8,8) 

を修正は、おそらくどちらか一方を再形成することを含む:

In [387]: x.ravel() + y 
Out[387]: 
array([ 1, 2, 3, 4, 5, ... 64]) 

又はx-y.reshape(8,8)

私の基本的なところは、どのような配列の形が意味するのか、また異なる形の配列を一緒に使うことができるかどうかを理解する必要があります。エラーを「回避」しないで、入力を修正して、それらが「放送」対応になるようにします。

問題は特定の要素の値ではないと思います。

ifコンテキストでアレイをテストしようとすると、truth valueエラーが発生します。 ifは、True/False値の配列ではなく、単純なTrueまたはFalseを想定しています。

In [389]: if x>0:print('yes') 
.... 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

非常に高く評価されています。ここで使用されているインポートされたモジュールは非常に新しくなっているので、私はあなたの応答をより慎重に検討し、これをしばらく再生します。おそらく、これが依存しているモジュール(配列とブロードキャストルールに焦点を当てる)それが私を得る場所を参照してください。あなたの時間のために多くのありがとう! – Ryan

+1

'sklearns'が提供する' datasets'の性質についてもっと読む必要があるかもしれません。他の 'sklearn'の質問を検索しなければならないかもしれません。 – hpaulj

関連する問題