ValueError khi kiểm tra nếu biến là None hoặc numpy.array


104

Tôi muốn kiểm tra xem biến là None hay numpy.array. Tôi đã triển khai check_achức năng để làm điều này.

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

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

Tuy nhiên, mã này làm tăng ValueError. Con đường thẳng tiến là gì?

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
Đây ValueErrorlà một trong những numpycâu hỏi phổ biến nhất . Nó có nghĩa là not atạo ra một mảng boolean, với (trong trường hợp này) 2 giá trị. Mảng boolean này không thể được sử dụng như một ifđiều kiện! Các is Nonethay thế là tốt để biết, nhưng bạn cũng nên hiểu lỗi này.
hpaulj

@hpaulj: Không hoàn toàn - bạn không thể quá tải not, vì vậy lỗi thực sự xảy ra khi notcố gắng xử lý mảng như một boolean duy nhất và phát hiện ra nó không thể. Nếu đúng như vậy ~a, điều đó sẽ sử dụng quá tải của NumPy và không thành công khi ifcố gắng sử dụng mảng bị phủ định như một boolean duy nhất.
user2357112 hỗ trợ Monica

Câu trả lời:


174

Sử dụng not ađể kiểm tra xem aNonegiả định rằng các giá trị có thể có khác có giá trị achân lý hay không True. Tuy nhiên, hầu hết các mảng NumPy hoàn toàn không có giá trị sự thật và notkhông thể áp dụng cho chúng.

Nếu bạn muốn kiểm tra xem một đối tượng có phải là đối tượng hay không None, thì cách chung nhất, đáng tin cậy nhất là sử dụng iskiểm tra theo nghĩa đen None:

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

Điều này không phụ thuộc vào các đối tượng có giá trị true, vì vậy nó hoạt động với các mảng NumPy.

Lưu ý rằng bài kiểm tra phải được is, không ==. islà một bài kiểm tra nhận dạng đối tượng. ==là bất cứ điều gì các đối số cho biết nó là gì và các mảng NumPy nói rằng đó là một phép so sánh bình đẳng phần tử được phát sóng, tạo ra một mảng boolean:

>>> 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()

Mặt khác, nếu bạn muốn kiểm tra xem một đối tượng có phải là mảng NumPy hay không, bạn có thể kiểm tra kiểu của nó:

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

Bạn cũng có thể sử dụng isinstance, nó cũng sẽ trả về Truecho các lớp con của loại đó (nếu đó là những gì bạn muốn). Xem xét mức độ khủng khiếp và không tương thích np.matrix, bạn có thể không thực sự muốn điều này:

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

4
mà bạn đề nghị là giải pháp "tốt nhất"?
Monica Heddneck

2

Nếu bạn đang cố gắng làm điều gì đó rất a is not Nonegiống:, vấn đề tương tự sẽ xuất hiện. Đó là, Numpy phàn nàn rằng người ta phải sử dụng a.anyhoặc a.all.

Một giải pháp thay thế là:

if not (a is None):
    pass

Không quá xinh, nhưng nó làm được việc.


0

Bạn có thể xem đối tượng có hình dạng hay không

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

1
không tán thành vì: các loại khác cũng có thể có thuộc tính hình dạng và thậm chí chúng có thể có ý nghĩa khác nhau.
Herbert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.