Numpy.array সমতা জন্য দাবী করার সেরা উপায়?


108

আমি আমার অ্যাপ্লিকেশনের জন্য কিছু ইউনিট-পরীক্ষা করতে চাই এবং আমাকে দুটি অ্যারে তুলনা করতে হবে। যেহেতু array.__eq__নতুন অ্যারে প্রদান করে (তাই TestCase.assertEqualব্যর্থ হয়), তাই সমতার পক্ষে দাবি করার সর্বোত্তম উপায় কী?

বর্তমানে আমি ব্যবহার করছি

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

তবে আমি আসলে এটি পছন্দ করি না


4
মনে রাখবেন যে আপনার উদাহরণটি অপ্রত্যাশিতভাবে সত্য উপার্জন করতে পারে, উদাহরণস্বরূপ (np.array([1, 1]) == np.array([1])).all()সত্যটি পাওয়া যাবে
এম বার্নহার্ট

4
self.assertTrue (np.array_equal (অ্যারে 1, অ্যারে 2))
Miszo97

উত্তর:


122

এ্যাসার্ট ফাংশনগুলি পরীক্ষা করুন numpy.testing, যেমন

assert_array_equal

ভাসমান পয়েন্ট অ্যারে সমতা পরীক্ষা ব্যর্থ হতে পারে এবং assert_almost_equalআরও নির্ভরযোগ্য।

হালনাগাদ

কয়েকটি সংস্করণ পূর্বে নম্পি পেয়েছিল assert_allcloseযা এখন আমার প্রিয় কারণ এটি আমাদের নিখুঁত এবং আপেক্ষিক ত্রুটি উভয়ই নির্দিষ্ট করতে দেয় এবং নিকটতার মানদণ্ড হিসাবে দশমিক বৃত্তাকার প্রয়োজন হয় না।


19
এটি কীভাবে ইউনিটেস্টের সাথে ইন্টারেক্ট করে? আমি মনে করি যে বিষয়ে কিছু শব্দ কার্যকর হবে।
রামন মার্টিনেজ

আমি কখনই ইউনিটেস্ট ব্যবহার করি না। যাইহোক, এটি নস্টিস্টসগুলির সাথে খুব ভালভাবে কাজ করে যা নম্পি, স্কিপি এবং স্ট্যাটাসমডেলগুলি দ্বারা ব্যবহৃত হয়। কেবলমাত্র একটি পরীক্ষা ফাংশন বা পদ্ধতির অভ্যন্তরে জমিগুলি ব্যবহার করুন।
জোসেফ

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

4
@ রমনমার্টিনেজ মনে করেন_লক ক্লোজটি ইউনিটটেস্টের সাথে দুর্দান্ত খেলছে বলে মনে হচ্ছে :)
কোটাকোটাকোটা

5
@ রামনমার্টিনেজ আপনি যদি পাইথন unittestব্যবহার self.assertIsNone(np.testing.assert_array_equal(a, b))করেন Noneতবে অ্যারে সমান হলে এটির হিসাবে আপনি এটি ব্যবহার করতে পারবেন ।
mjkrause

25

আমার মনে হয় (arr1 == arr2).all()বেশ সুন্দর লাগছে। তবে আপনি ব্যবহার করতে পারেন:

numpy.allclose(arr1, arr2)

তবে এটি একরকম নয়।

একটি বিকল্প, আপনার উদাহরণের মতো প্রায়:

numpy.alltrue(arr1 == arr2)

নোট করুন যে scipy.array আসলে একটি রেফারেন্স numpy.array। এটি ডকুমেন্টেশনগুলি সন্ধান করা সহজ করে তোলে।


19

আমি এটি ব্যবহার করে দেখতে পাচ্ছি self.assertEqual(arr1.tolist(), arr2.tolist()) ইউনিটেস্টের সাথে অ্যারের তুলনা করার সবচেয়ে সহজ উপায়টি ব্যবহার।

আমি সম্মতি জানাই যে এটি সর্বোত্তম সমাধান নয় এবং এটি সম্ভবত দ্রুততম নয় তবে এটি আপনার পরীক্ষার বাকী ক্ষেত্রেগুলির সাথে সম্ভবত আরও ইউনিফর্ম, আপনি সমস্ত ইউনিটেস্ট ত্রুটির বিবরণ পান এবং এটি বাস্তবায়ন করা সত্যই সহজ।


4
নোট করুন এটি কার্যকরভাবে কাজ করবে না np.nan, যেহেতু np.nan != np.nanএবং self.assertEqualপ্রচেষ্টা এর জন্য অ্যাকাউন্ট করতে সক্ষম হবে না।
কৃষ্ণস্ত্রি

5

পাইথন ৩.২ থেকে আপনি ব্যবহার করতে পারেন assertSequenceEqual(array1.tolist(), array2.tolist())

এটিতে সঠিক আইটেমগুলি দেখানোর অতিরিক্ত মূল্য রয়েছে যা অ্যারে পৃথক করে।


5
দুর্ভাগ্যক্রমে, অ্যারে floatটাইপ করার সময় এটি ভাল কাজ করে না । আমাদের সত্যই দরকারassertSequenceAlmostEqual
grwlf


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.