সামঞ্জস্যের জন্য দুটি নুমপি অ্যারে তুলনা করা হচ্ছে, উপাদান অনুসারে


252

সমতার জন্য দুটি NumPy অ্যারে তুলনা করার সহজ উপায় কী (যেখানে সমতা হিসাবে সংজ্ঞায়িত করা হয়: সমস্ত সূচকের জন্য A = B iff A[i] == B[i]) :?

সহজভাবে ব্যবহার করা ==আমাকে একটি বুলিয়ান অ্যারে দেয়:

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

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

andঅ্যারেগুলি সমান কিনা তা নির্ধারণ করার জন্য কি আমার কাছে এই অ্যারের উপাদানগুলি রয়েছে বা তুলনা করার সহজ উপায় আছে?

উত্তর:


380
(A==B).all()

অ্যারের সমস্ত মান (A == B) সত্য হলে পরীক্ষা করুন।

দ্রষ্টব্য: সম্ভবত আপনি A এবং B আকৃতি যেমন পরীক্ষা করতে চান A.shape == B.shape

বিশেষ কেস এবং বিকল্পগুলি (ডাবউপের উত্তর এবং যোভরামের মন্তব্য থেকে)

এটি লক্ষ করা উচিত যে:

  • এই সমাধানটি কোনও বিশেষ ক্ষেত্রে একটি অদ্ভুত আচরণ করতে পারে: যদি হয় হয় 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

26
আপনি প্রায় সর্বদা np.array_equalআইএমই চান । A এবং B এর দৈর্ঘ্য আলাদা থাকলে ক্রাশ(A==B).all() হবে । নকল 1.10 হিসাবে, == এক্ষেত্রে অবচয় হুঁশিয়ারি উত্থাপন করে
উইলফ্রেড হিউজেস

আপনি একটি ভাল পয়েন্ট পেয়েছেন, কিন্তু ক্ষেত্রে আমি সাধারণত আকারের আগে সাধারণত এটি সরাসরি পরীক্ষা করতে পছন্দ করি সেই আকারের বিষয়ে আমার সন্দেহ আছে। তারপরে ত্রুটিটি আকারগুলিতে স্পষ্টভাবে রয়েছে যার বিভিন্ন মান থাকার চেয়ে সম্পূর্ণ ভিন্ন অর্থ রয়েছে। তবে এটি সম্ভবত প্রতিটি ব্যবহারের ক্ষেত্রে নির্ভর করে
জুহ_

2
আরেকটি ঝুঁকি হ'ল যদি অ্যারেগুলিতে ন্যান থাকে। সেক্ষেত্রে আপনি মিথ্যা পাবেন কারণ নান! = ন্যান
ভিন্সনজুও

1
এটি উল্লেখ করা ভাল। যাইহোক, আমি এটি যৌক্তিক বলে মনে করি কারণ এটি nan!=nanবোঝায় array(nan)!=array(nan)
জুহ_

আমি এই আচরণটি বুঝতে পারি না: import numpy as np H = 1/np.sqrt(2)*np.array([[1, 1], [1, -1]]) #hadamard matrix np.array_equal(H.dot(H.T.conj()), np.eye(len(H))) # checking if H is an unitary matrix or not এইচ একটি একক ম্যাট্রিক্স, সুতরাং এইচ এক্স H.T.conjএকটি পরিচয় ম্যাট্রিক্স। তবে np.array_equalমিথ্যা ফিরিয়ে দেয়
ডেক্স

91

(A==B).all()সমাধান খুব ঝরঝরে, কিন্তু এই কাজের জন্য কিছু বিল্ট-ইন ফাংশন আছে। যথা array_equal, allcloseএবং array_equiv

(যদিও এর সাথে কিছু দ্রুত পরীক্ষার মাধ্যমে timeitমনে হয় যে (A==B).all()পদ্ধতিটি দ্রুততম, যা কিছুটা অদ্ভুত, একে সম্পূর্ণ নতুন অ্যারে বরাদ্দ করতে হবে))


15
আপনি ঠিক বলেছেন, তুলনামূলক অ্যারেগুলির মধ্যে একটি যদি খালি হয় তবে আপনি ভুল উত্তরটি পেয়ে যাবেন (A==B).all()। উদাহরণস্বরূপ, চেষ্টা করুন (np.array([1])==np.array([])).all()Truenp.array_equal(np.array([1]), np.array([]))False
:,

1
আমি ঠিক এই পারফরম্যান্সের পার্থক্যটিও আবিষ্কার করেছি। এটি আশ্চর্যজনক কারণ আপনার কাছে যদি 2 টি অ্যারে থাকে যা সম্পূর্ণ আলাদা (a==b).all()তবে এখনও দ্রুত np.array_equal(a, b)(যা কেবলমাত্র একটি একক উপাদানটি পরীক্ষা করে বেরিয়ে আসতে পারত)।
আইডান কেন

np.array_equalএছাড়াও lists of arraysএবং সঙ্গে কাজ করে dicts of arrays। এটি ধীর পারফরম্যান্সের কারণ হতে পারে।
বার্নহার্ড

ফাংশনটির জন্য অনেক অনেক ধন্যবাদ allclose, এটি আমার সংখ্যার গণনার জন্য প্রয়োজন । এটি সহনশীলতার মধ্যে ভেক্টরের সমতার তুলনা করে । :)
প্রিয়.by. জেসুস

নোট করুন np.array_equiv([1,1,1], 1) is True। এটি কারণ: আকারের সামঞ্জস্যপূর্ণ অর্থ তারা হয় একই আকৃতি হয় বা অন্য একটির মতো একই আকার তৈরি করতে একটি ইনপুট অ্যারে সম্প্রচার করা যেতে পারে।
এলিয়াদএল

13

নিম্নলিখিত কোডের টুকরা ব্যবহার করে কর্মক্ষমতা পরিমাপ করি।

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 পদ্ধতি।


4
পরীক্ষার নির্ভুলতা বাড়াতে আপনার কমপক্ষে একটি বড় অ্যারের আকার ব্যবহার করা উচিত যা কমপক্ষে এক সেকেন্ড সময় নেয়।
বিদ্যায়াত আগরওয়াল

যখন তুলনার ক্রম পরিবর্তন হয় তখন এটি কি পুনরুত্পাদন করে? বা প্রতিবার এলোমেলো করে এ এবং বি পুনরায় লাগিয়ে দিচ্ছেন? এ এবং বি কোষের মেমরি ক্যাশিং থেকেও এই পার্থক্যটি ব্যাখ্যা করা যেতে পারে।
বা গ্রোম্যান

3
এই সময়গুলির মধ্যে কোনও অর্থপূর্ণ পার্থক্য নেই।

13

যদি আপনি যাচাই করতে চান যে দুটি অ্যারে একই থাকে 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

5

সাধারণত দুটি অ্যারেতে কিছু ছোট অঙ্কের ত্রুটি থাকবে,

numpy.allclose(A,B)পরিবর্তে, আপনি ব্যবহার করতে পারেন (A==B).all()। এটি একটি বুল সত্য / মিথ্যা প্রদান করে


0

এখন ব্যবহার করুন np.array_equal। ডকুমেন্টেশন থেকে:

np.array_equal([1, 2], [1, 2])
True
np.array_equal(np.array([1, 2]), np.array([1, 2]))
True
np.array_equal([1, 2], [1, 2, 3])
False
np.array_equal([1, 2], [1, 4])
False
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.