python - समानता, तत्व-वार के लिए दो numpy arrays की तुलना करना



python-3.x elementwise-operations (3)

समानता के लिए दो numpy arrays की तुलना करने का सबसे आसान तरीका क्या है (जहां समानता को परिभाषित किया गया है: सभी सूचकांक के लिए ए = बी iff i: A[i] == B[i] )?

बस == का उपयोग करके मुझे एक बुलियन सरणी देता है:

 >>> numpy.array([1,1,1]) == numpy.array([1,1,1])

array([ True,  True,  True], dtype=bool)

क्या मुझे यह निर्धारित करने के लिए इस सरणी के तत्व हैं कि क्या सरणी बराबर हैं या तुलना करने का एक आसान तरीका है?

https://ffff65535.com


आइए निम्नलिखित कोड के कोड का उपयोग करके प्रदर्शन को मापें।

import numpy as np
import time

exec_time0 = []
exec_time1 = []
exec_time2 = []

sizeOfArray = 5000
numOfIterations = 200

for i in xrange(numOfIterations):

    A = np.random.randint(0,255,(sizeOfArray,sizeOfArray))
    B = np.random.randint(0,255,(sizeOfArray,sizeOfArray))

    a = time.clock() 
    res = (A==B).all()
    b = time.clock()
    exec_time0.append( b - a )

    a = time.clock() 
    res = np.array_equal(A,B)
    b = time.clock()
    exec_time1.append( b - a )

    a = time.clock() 
    res = np.array_equiv(A,B)
    b = time.clock()
    exec_time2.append( b - a )

print 'Method: (A==B).all(),       ', np.mean(exec_time0)
print 'Method: np.array_equal(A,B),', np.mean(exec_time1)
print 'Method: np.array_equiv(A,B),', np.mean(exec_time2)

उत्पादन

Method: (A==B).all(),        0.03031857
Method: np.array_equal(A,B), 0.030025185
Method: np.array_equiv(A,B), 0.030141515

उपरोक्त परिणामों के मुताबिक, numpy विधियों == ऑपरेटर और सभी () विधि के संयोजन से तेज़ प्रतीत होते हैं और numpy विधियों की तुलना करके सबसे तेज़ व्यक्ति numpy.array_equal विधि प्रतीत होता है।


यदि आप जांचना चाहते हैं कि दो सरणी के समान shape और elements तो आपको np.array_equal उपयोग करना चाहिए क्योंकि यह दस्तावेज़ में अनुशंसित विधि है।

प्रदर्शन-वार उम्मीद नहीं करते कि किसी भी समानता जांच दूसरे को हराएगी, क्योंकि comparing two elements करने के अनुकूलन के लिए ज्यादा जगह नहीं है। बस इसके लिए, मैंने अभी भी कुछ परीक्षण किए हैं।

import numpy as np
import timeit

A = np.zeros((300, 300, 3))
B = np.zeros((300, 300, 3))
C = np.ones((300, 300, 3))

timeit.timeit(stmt='(A==B).all()', setup='from __main__ import A, B', number=10**5)
timeit.timeit(stmt='np.array_equal(A, B)', setup='from __main__ import A, B, np', number=10**5)
timeit.timeit(stmt='np.array_equiv(A, B)', setup='from __main__ import A, B, np', number=10**5)
> 51.5094
> 52.555
> 52.761

इतना काफी बराबर, गति के बारे में बात करने की कोई ज़रूरत नहीं है।

(A==B).all() निम्न कोड स्निपेट के रूप में बहुत अधिक व्यवहार करता है:

x = [1,2,3]
y = [1,2,3]
print all([x[i]==y[i] for i in range(len(x))])
> True

(A==B).all()

परीक्षण करें कि सरणी के सभी मान (ए == बी) सही हैं।

संपादित करें (dbaupp के उत्तर और योवराम की टिप्पणी से)

इस बात पर ध्यान दिया जाना चाहिए कि:

  • इस समाधान में किसी विशेष मामले में एक अजीब व्यवहार हो सकता है: यदि या तो A या B खाली है और दूसरे में एक तत्व है, तो यह True । किसी कारण से, तुलना A==B एक खाली सरणी देता है, जिसके लिए all ऑपरेटर True लौटाते हैं।
  • एक और जोखिम यह है कि यदि A और B पास समान आकार नहीं है और प्रसारण योग्य नहीं है, तो यह दृष्टिकोण एक त्रुटि उठाएगा।

अंत में, मैंने प्रस्तावित समाधान मानक है, मुझे लगता है, लेकिन अगर आपको A और B आकार के बारे में कोई संदेह है या बस सुरक्षित होना चाहते हैं: विशेष कार्यों में से एक का उपयोग करें:

np.array_equal(A,B)  # test if same shape, same elements values
np.array_equiv(A,B)  # test if broadcastable shape, same elements values
np.allclose(A,B,...) # test if same shape, elements have close enough values




elementwise-operations