วิธีที่ดีที่สุดในการยืนยันความเท่าเทียมกันของ numpy.array?


105

ฉันต้องการทดสอบหน่วยสำหรับแอปของฉันและฉันต้องการเปรียบเทียบอาร์เรย์สองอาร์เรย์ เนื่องจากarray.__eq__ส่งคืนอาร์เรย์ใหม่ (จึงTestCase.assertEqualล้มเหลว) วิธีที่ดีที่สุดในการยืนยันความเท่าเทียมกันคืออะไร?

ตอนนี้ฉันใช้

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

แต่ฉันไม่ชอบมันจริงๆ


1
โปรดทราบว่าตัวอย่างของคุณสามารถให้ผลลัพธ์เป็น True โดยไม่คาดคิดเช่น(np.array([1, 1]) == np.array([1])).all()จะให้ True
M. Bernhardt

1
self.assertTrue (np.array_equal (array1, array2))
Miszo97

คำตอบ:


120

ตรวจสอบฟังก์ชันยืนยันในnumpy.testingเช่น

assert_array_equal

สำหรับการทดสอบความเท่าเทียมกันของอาร์เรย์ทศนิยมอาจล้มเหลวและassert_almost_equalมีความน่าเชื่อถือมากขึ้น

อัพเดต

ไม่กี่เวอร์ชันที่ผ่านมาได้รับ numpy assert_allcloseซึ่งตอนนี้เป็นที่ชื่นชอบเนื่องจากช่วยให้เราสามารถระบุทั้งข้อผิดพลาดสัมบูรณ์และข้อผิดพลาดสัมพัทธ์และไม่จำเป็นต้องมีการปัดเศษทศนิยมเป็นเกณฑ์ความใกล้ชิด


18
สิ่งนี้โต้ตอบกับ Unittest อย่างไร? ฉันคิดว่าคำบางคำในเรื่องนี้น่าจะเป็นประโยชน์
Ramon Martinez

ฉันไม่เคยใช้ unittest อย่างไรก็ตามมันทำงานได้ดีกับ nosetests ซึ่งใช้โดย numpy, scipy และ statsmodels เพียงใช้คำยืนยันในฟังก์ชันหรือวิธีการทดสอบ
Josef

สิ่งนี้ไม่ได้ตรวจสอบว่าอาร์กิวเมนต์ทั้งสองเป็นอาร์เรย์จำนวนนับ ตัวอย่างเช่นจะประสบความสำเร็จในอาร์เรย์และรายการ สำหรับการทดสอบอาจเป็นประโยชน์ในการตรวจสอบว่าอาร์เรย์เหล่านี้เป็นอาร์เรย์จริง แต่ฉันเดาว่าต้องตรวจสอบประเภทด้วยตนเองหรือไม่
สูงสุด

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.nanและself.assertEqualพยายามที่จะไม่สามารถไปยังบัญชีที่
blacksite

5

ตั้งแต่ Python 3.2 คุณสามารถใช้assertSequenceEqual(array1.tolist(), array2.tolist()).

สิ่งนี้มีมูลค่าเพิ่มในการแสดงรายการที่อาร์เรย์แตกต่างกัน


5
น่าเสียดายที่มันทำงานได้ไม่ดีเมื่ออาร์เรย์เป็นfloatประเภท เราต้องการจริงๆassertSequenceAlmostEqual
grwlf


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.