Cách tốt nhất để khẳng định cho bình đẳng numpy.array?


103

Tôi muốn thực hiện một số bài kiểm tra đơn vị cho ứng dụng của mình và tôi cần so sánh hai mảng. Vì array.__eq__trả về một mảng mới ( TestCase.assertEqualkhông thành công), cách tốt nhất để khẳng định sự bình đẳng là gì?

Hiện tại tôi đang sử dụng

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

nhưng tôi không thực sự thích nó


1
lưu ý rằng ví dụ của bạn có thể mang lại True bất ngờ, ví dụ: (np.array([1, 1]) == np.array([1])).all()sẽ mang lại True
M. Bernhardt

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

Câu trả lời:


119

kiểm tra các chức năng khẳng định trong numpy.testing, ví dụ:

assert_array_equal

đối với mảng dấu phẩy động, thử nghiệm bình đẳng có thể không thành công và assert_almost_equalđáng tin cậy hơn.

cập nhật

Một vài phiên bản trước đây, numpy đã lấy được assert_allclosemà bây giờ là yêu thích của tôi vì nó cho phép chúng tôi chỉ định cả lỗi tuyệt đối và tương đối và không yêu cầu làm tròn số thập phân làm tiêu chí gần đúng.


18
Làm thế nào để điều này tương tác với unittest? Tôi nghĩ rằng một số từ về vấn đề này sẽ hữu ích.
Ramon Martinez

Tôi không bao giờ sử dụng đơn nhất. Tuy nhiên, nó hoạt động rất tốt với nosetests được sử dụng bởi numpy, scipy và statsmodels. Chỉ cần sử dụng các xác nhận bên trong một hàm hoặc phương pháp kiểm tra.
Josef

Điều này không xác minh rằng hai đối số là cả hai mảng rỗng. Ví dụ, nó sẽ thành công trên một mảng và một danh sách. Để kiểm tra, có thể hữu ích khi xác minh rằng đây thực sự là các mảng, nhưng tôi đoán nó sẽ yêu cầu kiểm tra loại theo cách thủ công?
tối đa

4
@RamonMartinez khẳng định_allclose dường như chơi tuyệt vời với sự hấp dẫn nhất :)
kotakotakota

4
@RamonMartinez nếu bạn sử dụng Python, unittestbạn có thể sử dụng self.assertIsNone(np.testing.assert_array_equal(a, b))vì nó trả về Nonenếu các mảng bằng nhau.
mjkrause

24

Tôi nghĩ (arr1 == arr2).all()trông khá đẹp. Nhưng bạn có thể sử dụng:

numpy.allclose(arr1, arr2)

nhưng nó không hoàn toàn giống nhau.

Một thay thế, gần giống như ví dụ của bạn là:

numpy.alltrue(arr1 == arr2)

Lưu ý rằng scipy.array thực sự là một tham chiếu numpy.array. Điều đó giúp bạn dễ dàng tìm thấy tài liệu hơn.


18

Tôi thấy rằng sử dụng self.assertEqual(arr1.tolist(), arr2.tolist()) là cách dễ nhất để so sánh mảng với mảng đơn nhất.

Tôi đồng ý rằng nó không phải là giải pháp đẹp nhất và có lẽ không phải là nhanh nhất nhưng nó có thể đồng nhất hơn với phần còn lại của các trường hợp thử nghiệm của bạn, bạn nhận được tất cả các mô tả lỗi đơn giản nhất và nó thực sự đơn giản để thực hiện.


1
Lưu ý rằng điều này sẽ không hoạt động tốt với np.nannp.nan != np.nanself.assertEqualnỗ lực sẽ không thể giải thích cho điều đó.
blacksite

5

Kể từ Python 3.2, bạn có thể sử dụng assertSequenceEqual(array1.tolist(), array2.tolist()).

Điều này có giá trị bổ sung là hiển thị cho bạn các mục chính xác mà các mảng khác nhau.


5
Thật không may, nó không hoạt động tốt khi các mảng thuộc floatloại. Chúng tôi thực sự cầnassertSequenceAlmostEqual
grwlf

3

Trong các thử nghiệm của tôi, tôi sử dụng cái này:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.