মান মূল্য: একাধিক উপাদান সহ একটি অ্যারের সত্য মান অস্পষ্ট। A.any () বা a.all () ব্যবহার করুন


221

আমি সবেমাত্র আমার কোডটিতে একটি লজিকাল বাগ আবিষ্কার করেছি যা সকল ধরণের সমস্যা সৃষ্টি করে। আমি অজান্তে একটি লজিক্যাল এ্যান্ড এর পরিবর্তে কিছুটা এবং কিছু করছি

আমি কোডটি থেকে পরিবর্তন করেছি:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

প্রতি:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]

আমার অবাক করার জন্য, আমি বরং ক্রিপ্টিক ত্রুটি বার্তা পেয়েছি:

মান মূল্য: একাধিক উপাদান সহ একটি অ্যারের সত্য মান অস্পষ্ট। A.any () বা a.all () ব্যবহার করুন

আমি যখন বিটওয়াস অপারেশনটি ব্যবহার করি তখন কেন একই ধরণের ত্রুটি নির্গত হয় নি - এবং আমি কীভাবে এটি সংশোধন করব?


1
পান্ডাস অফার ডকুমেন্টেশন এই জন্য ভাল হিসাবে
গ্রেগ

উত্তর:


164

rএকটি অদ্ভুত (rec) অ্যারে। সুতরাং r["dt"] >= startdateএকটি (বুলিয়ান) অ্যারে। নাম্পার অ্যারেগুলির জন্য &অপারেশনটি এলিমেন্টওয়াইস -এবং দুটি বুলিয়ান অ্যারে প্রদান করে।

NumPy ডেভেলপারদের অনুভূত কেউ সাধারণভাবে বোঝা বুলিয়ান প্রেক্ষাপটে একটি অ্যারের নির্ণয় করা উপায় ছিল: এটা মানে হতে পারে Trueযদি কোনো উপাদান True, অথবা এটি মানে হতে পারে Trueযদি সব উপাদান True, বা Trueযদি অ্যারের নন-জিরো দৈর্ঘ্য আছে, মাত্র তিন নাম সম্ভাবনার।

যেহেতু বিভিন্ন ব্যবহারকারীর বিভিন্ন প্রয়োজন এবং বিভিন্ন ধারনা থাকতে পারে, তাই নুমপি বিকাশকারীরা অনুমান করতে অস্বীকার করেছিলেন এবং এর পরিবর্তে যখনই কেউ বুলিয়ান প্রসঙ্গে একটি অ্যারের মূল্যায়ন করার চেষ্টা করবেন তখন একটি ভ্যালুআরর বাড়ানোর সিদ্ধান্ত নিয়েছে। প্রয়োগ করা হচ্ছে andদুই numpy অ্যারে দুই অ্যারে বুলিয়ান প্রেক্ষাপটে মূল্যায়ন করা (কল করে ঘটায় __bool__Python3 অথবা __nonzero__Python2 মধ্যে)।

আপনার মূল কোড

mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

সঠিক দেখাচ্ছে তবে আপনি যদি না চান andতবে a and bব্যবহারের পরিবর্তে (a-b).any()বা (a-b).all()


2
তুমি ঠিক বলছো. মূল কোডটি সঠিক ছিল। বাগ কোডটি অন্য কোথাও শুয়ে আছে বলে মনে হচ্ছে।
হোমঙ্কুলাস রেটিকুলি

2
দুর্দান্ত ব্যাখ্যা। তবে এটি বোঝায় যে NumPy বেশ দক্ষ
জোয়াকিম ডব্লিউ

@JoachimWuttke: যদিও np.allএবং np.anyশর্ট-সার্কিট করতে সক্ষম, যুক্তি এটি পাস করার আগে মূল্যায়ন করা হয় np.allবা np.anyশর্ট সার্কিট সুযোগ রয়েছে। আরও ভাল করতে, বর্তমানে, আপনাকে এর অনুরূপ বিশেষ সি / সিথন কোডটি লিখতে হবে ।
আনটবু

47

আমার একই সমস্যা ছিল (অর্থাত্ মাল্টি-শর্তগুলির সাথে সূচীকরণ, এখানে এটি একটি নির্দিষ্ট তারিখের সীমাতে ডেটা সন্ধান করছে)। (a-b).any()অথবা (a-b).all()কাজ করছে না মনে অন্তত আমার জন্য।

বিকল্পভাবে আমি আরও একটি সমাধান পেয়েছি যা আমার পছন্দসই কার্যকারিতার জন্য নিখুঁতভাবে কাজ করে ( একটি অ্যারেরকে সূচিকরণের চেষ্টা করার সময় একাধিক উপাদান সহ একটি অ্যারের সত্য মান দ্বিধাহীন )।

উপরে প্রস্তাবিত কোড ব্যবহার না করে কেবল একটি ব্যবহার করে numpy.logical_and(a,b)কাজ করা হবে। এখানে আপনি কোডটি পুনরায় লিখতে চাইতে পারেন

selected  = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]

34

ব্যতিক্রম হওয়ার কারণ হ'ল andসুস্পষ্টভাবে কল bool। প্রথমে বাম অপারেন্ডে এবং (যদি বাম অপারেন্ড হয় True) তারপরে ডান অপারেণ্ডে। সুতরাং x and yসমতূল্য bool(x) and bool(y)

তবে boolএকটি উপর numpy.ndarray(যদি এটি একাধিক উপাদান রয়েছে) ব্যতিক্রম আপনি দেখেছি নিক্ষেপ করা হবে:

>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

bool()কল অন্তর্নিহিত রয়েছে and, কিন্তু এর মধ্যে if, while, or, তাই নিচের উদাহরণটি কোন ব্যর্থতা হবে:

>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> arr or arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

পাইথনে আরও ফাংশন এবং স্টেটমেন্ট রয়েছে যা boolকলগুলি আড়াল করে, উদাহরণস্বরূপ 2 < x < 10লেখার অন্য একটি উপায় 2 < x and x < 10। আর andডাকব bool: bool(2 < x) and bool(x < 10)

উপাদান ভিত্তিক জন্য সমতুল্য andহবে np.logical_andফাংশন, একভাবে আপনি ব্যবহার করতে পারে np.logical_orসমতুল হিসাবে or

বুলিয়ান অ্যারে - এবং তুলনা পছন্দ <, <=, ==, !=, >=এবং >NumPy উপর অ্যারে বুলিয়ান NumPy অ্যারে আসতে - আপনার কাছে ব্যবহার করতে পারেন উপাদান-অনুযায়ী, bitwise ফাংশন (এবং অপারেটরদের): np.bitwise_and( &অপারেটর)

>>> np.logical_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> np.bitwise_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> (arr > 1) & (arr < 3)
array([False,  True, False], dtype=bool)

এবং bitwise_or( |অপারেটর):

>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> (arr <= 1) | (arr >= 3)
array([ True, False,  True], dtype=bool)

লজিকাল এবং বাইনারি ফাংশনগুলির একটি সম্পূর্ণ তালিকা নম্পপি ডকুমেন্টেশনে পাওয়া যাবে:


2

pandasআমার জন্য সমস্যাটি কী সমাধান হয়েছে তা নিয়ে যদি আপনি কাজ করেন তবে আমি যখন এনএ মান পেয়েছিলাম তখন আমি গণনা করার চেষ্টা করছিলাম, সমাধানটি চালানো হয়েছিল:

df = df.dropna()

এবং তার পরে যে গণনাটি ব্যর্থ হয়েছিল।


0

এই টাইপ করা ত্রুটি-বার্তাটি এমন একটি if-statementতুলনা সম্পন্ন করার সময়ও দেখায় যেখানে একটি অ্যারে থাকে এবং উদাহরণস্বরূপ একটি বুল বা ইনট। উদাহরণস্বরূপ দেখুন:

... code snippet ...

if dataset == bool:
    ....

... code snippet ...

এই ধারাটিতে অ্যারে হিসাবে ডেটাসেট রয়েছে এবং বুলটি "খোলা দরজা" ... Trueবা False

যদি কোনওটির মধ্যে ফাংশনটি মোড়ানো থাকে তবে try-statementআপনি except Exception as error:বার্তাটি এরর-টাইপ ছাড়াই পাবেন :

একাধিক উপাদান সহ একটি অ্যারের সত্য মান অস্পষ্ট। A.any () বা a.all () ব্যবহার করুন


-6

আপনি যা যা চান তার তুলনা করার জন্য আদেশটি অনুসরণ করে এই => numpy.array (r) বা numpy.array (আপনার পরিবর্তনশীল) ব্যবহার করে দেখুন।

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