ValueError เมื่อตรวจสอบว่าตัวแปรเป็น None หรือ numpy.array


105

ฉันต้องการตรวจสอบว่าตัวแปรเป็น None หรือ numpy.array ฉันได้ใช้check_aฟังก์ชันเพื่อทำสิ่งนี้

def check_a(a):
    if not a:
        print "please initialize a"

a = None
check_a(a)
a = np.array([1,2])
check_a(a)

แต่รหัสนี้ทำให้เกิด ValueError ทางตรงไปตรงมาคืออะไร?

ValueError                                Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
      6 check_a(a)
      7 a = np.array([1,2])
----> 8 check_a(a)

<ipython-input-41-0201c81c185e> in check_a(a)
      1 def check_a(a):
----> 2     if not a:
      3         print "please initialize a"
      4 
      5 a = None

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

2
นี่ValueErrorเป็นหนึ่งในnumpyคำถามที่พบบ่อย หมายความว่าnot aสร้างอาร์เรย์บูลีนโดยมี (ในกรณีนี้) 2 ค่า อาร์เรย์บูลีนนี้ไม่สามารถใช้เป็นifเงื่อนไขได้! is Noneเป็นทางเลือกที่ดีที่จะรู้ แต่คุณควรเข้าใจข้อผิดพลาดนี้
hpaulj

@hpaulj: ไม่มาก - คุณไม่สามารถโอเวอร์โหลดได้notดังนั้นข้อผิดพลาดจะเกิดขึ้นจริงเมื่อnotพยายามรักษาอาร์เรย์เป็นบูลีนเดียวและพบว่าไม่สามารถทำได้ หากเป็น~aเช่นนั้นจะใช้การโอเวอร์โหลดของ NumPy และล้มเหลวเมื่อifพยายามใช้อาร์เรย์ที่ถูกลบเป็นบูลีนเดี่ยว
user2357112 รองรับ Monica

คำตอบ:


177

ใช้not aเพื่อทดสอบว่าaเป็นNoneสันนิษฐานว่าค่าที่เป็นไปได้อื่น ๆ ของมีค่าความจริงของa Trueอย่างไรก็ตามอาร์เรย์ NumPy ส่วนใหญ่ไม่มีค่าความจริงเลยและnotไม่สามารถใช้กับอาร์เรย์เหล่านี้ได้

หากคุณต้องการทดสอบว่าวัตถุนั้นเป็นNoneอย่างไรวิธีทั่วไปและเชื่อถือได้ที่สุดคือใช้การisตรวจสอบตามตัวอักษรNone:

if a is None:
    ...
else:
    ...

สิ่งนี้ไม่ได้ขึ้นอยู่กับวัตถุที่มีค่าความจริงดังนั้นจึงใช้ได้กับอาร์เรย์ NumPy

โปรดทราบว่าการทดสอบจะต้องมีไม่is คือการทดสอบเอกลักษณ์ของวัตถุ คืออะไรก็ตามที่อาร์กิวเมนต์บอกว่าเป็นและอาร์เรย์ NumPy บอกว่าเป็นการเปรียบเทียบความเท่าเทียมกันขององค์ประกอบที่ออกอากาศโดยสร้างอาร์เรย์บูลีน:==is==

>>> a = numpy.arange(5)
>>> a == None
array([False, False, False, False, False])
>>> if a == None:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
 Use a.any() or a.all()

ในอีกด้านหนึ่งหากคุณต้องการทดสอบว่าวัตถุเป็นอาร์เรย์ NumPy หรือไม่คุณสามารถทดสอบประเภทของวัตถุได้:

# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
    ...
else:
    ...

คุณยังสามารถใช้isinstanceซึ่งจะส่งคืนTrueสำหรับคลาสย่อยของประเภทนั้น ๆ ด้วย (หากเป็นสิ่งที่คุณต้องการ) เมื่อพิจารณาถึงความเลวร้ายและเข้ากันไม่ได้np.matrixคุณอาจไม่ต้องการสิ่งนี้:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    

4
คุณแนะนำวิธีใดเป็นวิธีแก้ปัญหาที่ "ดีที่สุด"
Monica Heddneck

2

หากคุณกำลังพยายามทำสิ่งที่คล้ายกันมาก: a is not Noneปัญหาเดียวกันจะปรากฏขึ้น นั่นคือ Numpy บ่นว่าต้องใช้a.anyหรือa.all.

วิธีแก้ปัญหาคือต้องทำ:

if not (a is None):
    pass

ไม่สวยเกินไป แต่ทำงานได้ดี


0

คุณสามารถดูว่าวัตถุมีรูปร่างหรือไม่

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False

1
ลงคะแนนเนื่องจาก: ประเภทอื่น ๆ สามารถมีแอตทริบิวต์รูปร่างได้เช่นกันและอาจมีความหมายที่แตกต่างกัน
Herbert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.