Numpy.array समानता के लिए मुखर करने का सबसे अच्छा तरीका?


103

मैं अपने ऐप के लिए कुछ यूनिट-परीक्षण करना चाहता हूं, और मुझे दो सरणियों की तुलना करने की आवश्यकता है। चूंकि array.__eq__एक नया सरणी देता है (इसलिए TestCase.assertEqualविफल रहता है), समानता के लिए दावा करने का सबसे अच्छा तरीका क्या है?

वर्तमान में मैं उपयोग कर रहा हूं

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

लेकिन मुझे यह वास्तव में पसंद नहीं है


1
ध्यान दें कि आपका उदाहरण ट्रू अप्रत्याशित रूप से प्राप्त कर सकता है, उदाहरण के (np.array([1, 1]) == np.array([1])).all()लिए ट्रू
एम। बर्नहार्ड्ट

स्व.टसर्ट ट्रू (np.array_equal (array1, array2))
मिस्सो 97

जवाबों:


120

numpy.testingजैसे, मुखर कार्यों की जाँच करें

assert_array_equal

फ़्लोटिंग पॉइंट सरणियों के लिए समानता परीक्षण विफल हो सकता है और assert_almost_equalअधिक विश्वसनीय है।

अपडेट करें

कुछ संस्करण पहले सुपीरियर प्राप्त हुए थे assert_allcloseजो अब मेरे पसंदीदा हैं क्योंकि यह हमें पूर्ण और सापेक्ष त्रुटि दोनों को निर्दिष्ट करने की अनुमति देता है और क्लोजनेस मानदंड के रूप में दशमलव गोलाई की आवश्यकता नहीं होती है।


18
यह कैसे एकतरफा के साथ बातचीत करता है? मुझे लगता है कि इस मामले पर कुछ शब्द उपयोगी होंगे।
रेमन मार्टिनेज

मैं कभी भी यूनीटेस्ट का उपयोग नहीं करता। हालाँकि, यह बहुत अच्छी तरह से nosetests के साथ काम करता है जो कि numpy, scipy और आँकड़ेmodels द्वारा उपयोग किए जाते हैं। बस एक परीक्षण समारोह या विधि के अंदर मुखर का उपयोग करें।
जोसेफ

यह सत्यापित नहीं करता है कि दो तर्क दोनों पर्याप्त सरणियाँ हैं। उदाहरण के लिए, यह एक सरणी और एक सूची पर सफल होगा। परीक्षण के लिए, यह सत्यापित करना उपयोगी हो सकता है कि ये वास्तव में सरणियाँ हैं, लेकिन मुझे लगता है कि इसे मैन्युअल रूप से जाँचने की आवश्यकता होगी?
अधिकतम

4
@RamonMartinez assert_allclose को निडर के साथ अच्छी तरह से खेलना लगता है :)
kotakotakota

4
@ रमनमार्टिज़ यदि आप पायथन का उपयोग करते हैं तो आप इसका उपयोग 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()) करना सबसे आसान तरीका है जो किसी भी प्रकार के ऐरे के साथ तुलना करता है।

मैं मानता हूँ कि यह सबसे सुंदर समाधान नहीं है और यह शायद सबसे तेज़ नहीं है, लेकिन यह संभवतः आपके परीक्षण मामलों के बाकी हिस्सों के साथ अधिक समान है, आपको सभी सबसे मुश्किल त्रुटि विवरण मिलते हैं और इसे लागू करना वास्तव में सरल है।


1
ध्यान दें कि यह अच्छी तरह से काम नहीं करेगा np.nan, क्योंकि np.nan != np.nanऔर उस के लिए self.assertEqualप्रयास करने में सक्षम नहीं होगा।
अश्वेत

5

पायथन 3.2 के बाद से आप उपयोग कर सकते हैं assertSequenceEqual(array1.tolist(), array2.tolist())

इसमें आपको सटीक आइटम दिखाने का अतिरिक्त मूल्य है जिसमें सरणियाँ भिन्न होती हैं।


5
दुर्भाग्य से, यह अच्छी तरह से काम नहीं करता है जब सरणियाँ floatप्रकार की होती हैं। हमें वास्तव में जरूरत हैassertSequenceAlmostEqual
23:27

3

अपने परीक्षणों में मैं इसका उपयोग करता हूं:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.