numpy.arrayが等しいことをアサートする最良の方法は?


103

アプリの単体テストを作成したいのですが、2つの配列を比較する必要があります。array.__eq__新しい配列を返すので(TestCase.assertEqual失敗する)、等価性をアサートする最良の方法は何ですか?

現在使用しています

self.assertTrue((arr1 == arr2).all())

しかし、私はそれが本当に好きではありません


1
あなたの例が予期せずTrueを生成する可能性があることに注意してください。たとえば、(np.array([1, 1]) == np.array([1])).all()Trueを生成します
M. Bernhardt

self.assertTrue(np.array_equal(array1、array2))
Miszo97

回答:


119

アサート機能をでチェックアウトしnumpy.testing、例えば

assert_array_equal

浮動小数点配列の場合、等価テストは失敗する可能性があり、assert_almost_equal信頼性が高くなります。

更新

いくつかのバージョンのnumpyが取得されました。assert_allcloseこれは、絶対エラーと相対エラーの両方を指定できるため、近さの基準として小数丸めを必要としないため、現在私のお気に入りです。


18
これはユニットテストとどのように相互作用しますか?その件について少し言葉がお役に立つと思います。
Ramon Martinez

unittestを使用することはありません。ただし、numpy、scipy、およびstatsmodelsで使用されるnosetestsで非常にうまく機能します。テスト関数またはメソッド内でアサートを使用するだけです。
ジョセフ

これは、2つの引数が両方ともnumpy配列であることを検証しません。たとえば、配列とリストでは成功します。テストの場合、これらが実際に配列であることを確認すると役立つ場合がありますが、タイプを手動で確認する必要があると思いますか?
最大

4
@RamonMartinez assert_allcloseはunittestでうまく動作するようです:)
kotakotakota

4
@RamonMartinez Python unittestを使用しself.assertIsNone(np.testing.assert_array_equal(a, b))ているNone場合は、配列が等しい場合に返されるように使用できます。
mjkrause

24

(arr1 == arr2).all()はかなり見栄えがいいと思います。しかし、あなたは使うことができます:

numpy.allclose(arr1, arr2)

しかし、それはまったく同じではありません。

代わりに、あなたの例とほとんど同じです:

numpy.alltrue(arr1 == arr2)

scipy.arrayは実際には参照numpy.arrayであることに注意してください。これにより、ドキュメントを見つけやすくなります。


18

self.assertEqual(arr1.tolist(), arr2.tolist()) は、配列をunittestと比較する最も簡単な方法を使用することを見つけました 。

私はそれが最もきれいな解決策ではなく、おそらく最速ではないことに同意しますが、それはおそらく他のテストケースとより均一であり、すべてのユニットテストエラーの説明を取得し、実装は本当に簡単です。


1
これはとうまく動作しませんnp.nanから、np.nan != np.nanself.assertEqualの試みは、そのために考慮することはできません。
ブラックサイト

5

Python 3.2以降では、を使用できますassertSequenceEqual(array1.tolist(), array2.tolist())

これには、配列が異なる正確なアイテムを表示するという付加価値があります。


5
残念ながら、配列がfloatタイプの場合はうまく機能しません。本当に必要assertSequenceAlmostEqual
grwlf

3

私のテストではこれを使用します:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.