ValueError saat memeriksa apakah variabel adalah None atau numpy.array

104

Saya ingin memeriksa apakah variabelnya None atau numpy.array. Saya telah menerapkan check_afungsi untuk melakukan ini.

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

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

Tapi, kode ini memunculkan ValueError. Apa cara lurus ke depan?

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()
rkjt50r983.dll
sumber
2
Ini ValueErroradalah salah satu numpypertanyaan paling umum . Artinya not amenghasilkan array boolean, dengan (dalam hal ini) 2 nilai. Array boolean ini tidak dapat digunakan sebagai ifkondisi! The is Nonealternatif yang baik untuk mengetahui, tetapi Anda juga harus memahami kesalahan ini.
hpaulj
@hpaulj: Kurang tepat - Anda tidak bisa membebani secara berlebihan not, jadi kesalahan sebenarnya terjadi saat notmencoba memperlakukan array sebagai boolean tunggal dan ternyata tidak bisa. Jika sudah ~a, itu akan menggunakan NumPy overload dan gagal ketika ifmencoba menggunakan array yang dinegasikan sebagai boolean tunggal.
user2357112 mendukung Monica

Jawaban:

175

Menggunakan not auntuk menguji apakah aadalah Nonemengasumsikan bahwa nilai-nilai lain yang mungkin dari amemiliki nilai kebenaran True. Namun, kebanyakan array NumPy tidak memiliki nilai kebenaran sama sekali, dan nottidak dapat diterapkan padanya.

Jika Anda ingin menguji apakah suatu objek None, cara yang paling umum dan dapat diandalkan adalah dengan menggunakan tanda iscentang None:

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

Ini tidak bergantung pada objek yang memiliki nilai kebenaran, jadi ini bekerja dengan array NumPy.

Perhatikan bahwa tesnya harus is, bukan ==. isadalah tes identitas objek. ==adalah apa pun yang dikatakan argumen itu, dan array NumPy mengatakan itu adalah perbandingan persamaan elemen yang disiarkan, menghasilkan array 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()

Di sisi lain, jika Anda ingin menguji apakah suatu objek adalah array NumPy, Anda dapat menguji tipenya:

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

Anda juga bisa menggunakan isinstance, yang juga akan mengembalikan Truesubclass dari tipe itu (jika itu yang Anda inginkan). Mempertimbangkan betapa buruk dan tidak kompatibelnya np.matrix, Anda mungkin sebenarnya tidak menginginkan ini:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    
Jerfov2
sumber
4
mana yang Anda rekomendasikan sebagai solusi "terbaik"?
Monica Heddneck
2

Jika Anda mencoba melakukan sesuatu yang sangat mirip a is not None:, masalah yang sama akan muncul. Artinya, Numpy mengeluh harus menggunakan a.anyatau a.all.

Solusinya adalah dengan melakukan:

if not (a is None):
    pass

Tidak terlalu cantik, tapi berhasil.

mimoralea
sumber
0

Anda dapat melihat apakah benda itu berbentuk atau tidak

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False
Itachi
sumber
1
tidak dipilih karena: jenis lain dapat memiliki atribut bentuk juga, dan mereka bahkan mungkin memiliki arti yang berbeda.
Herbert