2016-04-24 16 views
1

私は個々の要素を1つの2D配列から別の次元配列にコピーしようとしています。私のコードは次の通りです:2つのnumpy 2次元配列の等価性をテストする

tp_matrix = np.array(tp_matrix) 
my_array = np.empty(shape = (tp_matrix.shape)) 

for x in range(tp_matrix.shape[0]): 
    for y in range(tp_matrix.shape[1]): 
     my_array[x][y] = tp_matrix[x][y] 


if(np.array_equal(my_array, tp_matrix)): 
    print('Equal') 
else: 
    print('Not equal') 

しかし、2つの配列は何らかの理由で等しくありません。ここでの問題は何ですか?私はそれを解決するために何ができますか?

num_pyのコピー機能を使用することはできません。これは後で、my_arrayの要素のいくつかに、あとでmy_matrixのものと同じ他の値で変更を加えたいからです。

編集:コードを実行すると、次のメッセージが表示されます。 FutureWarning:要素ごとの比較に失敗しました。代わりにスカラーを返しますが、将来は要素ごとの比較を実行します データセット(tp_matrix)に何か問題がありますか? TypeError:入力タイプにufunc 'isfinite'がサポートされておらず、入力がサポートされているタイプに強制的に強制的に変換されませんでした。キャストルール ''安全 '' データは浮動小数点数として格納されます。またそれは少し大きいです(399 x 5825)。

編集3:解決済み。私はPythonを再インストールする必要がありました。

+2

要素は浮いていますか?浮動小数点数を比較すると、そのような効果があります。 https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.allclose.html#numpy.allcloseを試してください。一般的に、浮動小数点数が等しいかどうかをテストするべきではありません。 – JulienD

+0

あなたの等価文に耐性を与えるために'numpy.allclose() 'を試してください。また、あなたのデータに関する情報(たぶんの例)とそれを使って何をしようとしているのかについては、「最高のコピー」を作成するソリューションがあるかもしれません。 – armatita

+0

tp_matrixとして整数と浮動小数点のリストのリストを使用して、コードを実行すると "Equal"になります。使用しているtp_matrixとは何ですか? –

答えて

3

np.allcloseを使用すると、浮動小数点数がコンピュータで表現される方法のため、浮動小数点配列の(ほぼ)等価性をテストできます。詳細については

、あなたが例えば"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

+0

allcloseは、編集2に示されているエラーを返します。 – Ar254

+0

'my_array.dtype'は何ですか? – JulienD

+0

'my_array = my_array.astype(np.float64)'を試してみて、 'tp_matrix'でも同じです。 – JulienD

0

を読むことができる私はあなたが経験していると、以下のなかったものを模倣しようとした:

one = np.array([1,2,3]) 
two = np.array([one,one,one]) 
three = np.empty(shape=(two.shape)) 
for x in range(two.shape[0]): 
    for y in range(two.shape[1]): 
     three[x][y] = two[x][y] 

が「2」の内容を印刷すると「3」できます次の結果は

print(three) 
array([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 
print(two) 
array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

私はnp.array_equal使用して等価性をテストする場合はTrueを返しますnumpyのこの小さな例えば、それは可能ですがroundiことエラーが発生すると、テストはFalseになります。おそらく、より効率的な方法がありますが

sum(sum(two==three)) == two.shape[0]*three.shape[1] 

:このため

この問題を回避するには、次のテストである可能性があります。