2015-09-30 9 views
8

सहित मैं परीक्षण करना चाहता हूं कि दो numpy arrays (करीब) बराबर हैं, इसलिए मैं np.allclose फ़ंक्शन का उपयोग कर रहा हूं। एकमात्र समस्या यह है कि यह True देता है यदि दो-आयामी मैट्रिक्स और बराबर तत्वों के त्रि-आयामी मैट्रिक्स दिए जाते हैं।परीक्षण करें कि दो numpy arrays (करीब) बराबर हैं, आकार

import numpy as np 

x = np.array([[3.14159265, -0.1], [-0.1, 0.1]]) 

y = np.array([[math.pi, -0.1], [-0.1, 0.1]]) 

z1 = np.array([[[3.14159265, -0.1], [-0.1, 0.1]], 
       [[3.14159265, -0.1], [-0.1, 0.1]]]) 
z2 = np.array([[[math.pi, -0.1], [-0.1, 0.1]], 
       [[math.pi, -0.1], [-0.1, 0.1]]]) 


np.allclose(x,y) 
# Returns true, as expected 

np.allclose(x,z1) 
# Also returns true, even though matrices are different shapes. Unwanted. 

अब, मैं के बारे में np.array_equal पता है, जो तत्वों और आकार तुलना, लेकिन यह अगर तत्वों करीब हैं, केवल अगर वे बराबर हैं मुझे परीक्षण करने की अनुमति नहीं देता है। उदाहरण के लिए,

np.array_equal(x,y) 

रिटर्न False

वहाँ एक समारोह मैं उपयोग कर सकते हैं कि इस मामले में (x,z1) के लिए (x,y) और (z1,z2) लेकिन झूठे के लिए सच वापस आ जाएगी है?

+4

वहां एक और जांच जोड़ने के बारे में - '(x.shape == z1.shape) और np.allclose (x, z1)'? – Divakar

उत्तर

9

क्या हो रहा है यह है कि allclose इसके इनपुट को प्रसारित करता है। यह broadcasting rules के बाद समान आकार के सरणी (उदा। और [3, 3, 3]) के साथ तुलना की अनुमति देता है।


अपने उद्देश्यों के लिए, numpy.testing कार्यों पर एक नज़र, विशेष रूप से np.testing.assert_allclose या assert_array_almost_equal है, जो आकार के साथ-साथ मूल्यों के लिए जाँच करेगा। (मुझे उन दो ऑफहैंड के बीच का अंतर याद नहीं है, लेकिन यह फ़्लोटिंग पॉइंट मतभेदों की गणना करने के तरीके से संबंधित है।)

यदि आप जोर-आधारित इकाई परीक्षण का उपयोग कर रहे हैं तो ये विशेष रूप से आसान हैं।

numpy.testing.assert_* कार्यों के अधिकांश (सभी?) फ़ंक्शन सरणी आकार के साथ-साथ मूल्य समानता के लिए जांचते हैं।

उदाहरण के लिए:

In [1]: import numpy as np 

In [2]: np.testing.assert_allclose([1], [[1]]) 

कौन सा पैदावार:

AssertionError: 
Not equal to tolerance rtol=1e-07, atol=0 

(shapes (1,), (1, 1) mismatch) 
x: array([1]) 
y: array([[1]]) 

इन कार्यों के बारे में पता करने के लिए एक और उपयोगी (और वर्तमान के रूप में अच्छी तरह दर्ज नहीं के रूप में यह हो सकता है) बात यह है कि वे तुलना NaN 'है बराबर है।

उदाहरण के लिए, इस सफल होगा:

In [3]: np.testing.assert_allclose([np.nan], [np.nan]) 

जबकि numpy.allclose एक ही मामले के लिए False वापस आ जाएगी:

In [4]: np.allclose([np.nan], [np.nan]) 
Out[4]: False 

एक तरफ ध्यान दें पर, numpy.isclose (लेकिन allclose) है एक equal_nan kwarg इसे नियंत्रित करने के लिए।

+0

मैं जोर-आधारित इकाई परीक्षण कर रहा हूं, इसलिए यह पूरी तरह से काम करता है। धन्यवाद –

+0

ध्यान दें कि 'np.testing.assert_allclose (1, [1, 1]) 'और इसी तरह के पास अभी भी पास है: एक ही फ्लोट (numpy scalar,' np.array (1) ') अभी भी प्रसारित है। शायद क्योंकि उनके पास 'आकार' विशेषता नहीं है (या एक खाली टुपल)। – Evert

संबंधित मुद्दे