Saya baru saja menemukan bug logis dalam kode saya yang menyebabkan segala macam masalah. Saya secara tidak sengaja melakukan bitwise DAN bukannya logika AND .
Saya mengubah kode dari:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
UNTUK:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]
Yang mengejutkan saya, saya mendapat pesan kesalahan yang agak samar:
ValueError: Nilai kebenaran sebuah array dengan lebih dari satu elemen bersifat ambigu. Gunakan a.any () atau a.all ()
Mengapa kesalahan serupa tidak dipancarkan ketika saya menggunakan operasi bitwise - dan bagaimana cara memperbaikinya?
Jawaban:
r
adalah array numpy (rec). Begitur["dt"] >= startdate
juga array (boolean). Untuk array numpy,&
operasi mengembalikan elemen-dan dari dua array boolean.Pengembang NumPy merasa tidak ada satu pun cara yang dipahami untuk mengevaluasi sebuah array dalam konteks boolean: itu bisa berarti
True
jika ada elemenTrue
, atau bisa berartiTrue
jika semua elemenTrue
, atauTrue
jika array memiliki panjang tidak nol, hanya untuk menyebutkan tiga kemungkinan.Karena pengguna yang berbeda mungkin memiliki kebutuhan dan asumsi yang berbeda, pengembang NumPy menolak untuk menebak dan sebaliknya memutuskan untuk meningkatkan ValueError setiap kali seseorang mencoba untuk mengevaluasi array dalam konteks boolean. Menerapkan
and
ke dua array numpy menyebabkan dua array dievaluasi dalam konteks boolean (dengan memanggil__bool__
Python3 atau__nonzero__
Python2).Kode asli Anda
terlihat benar. Namun, jika Anda memang menginginkannya
and
, maka alih-aliha and b
gunakan(a-b).any()
atau(a-b).all()
.sumber
np.all
dannp.any
mampu melakukan hubungan arus pendek, argumen yang diteruskan kepadanya dievaluasi sebelumnp.all
ataunp.any
memiliki peluang untuk mengalami hubungan arus pendek. Untuk melakukan yang lebih baik, saat ini, Anda harus menulis kode C / Cython khusus yang mirip dengan ini .Saya memiliki masalah yang sama (yaitu pengindeksan dengan berbagai kondisi, di sini menemukan data dalam rentang tanggal tertentu). The
(a-b).any()
atau(a-b).all()
tampak tidak bekerja, setidaknya untuk saya.Atau saya menemukan solusi lain yang berfungsi sempurna untuk fungsionalitas yang saya inginkan ( Nilai kebenaran sebuah array dengan lebih dari satu elemen ambigu ketika mencoba mengindeks sebuah array ).
Alih-alih menggunakan kode yang disarankan di atas, cukup menggunakan
numpy.logical_and(a,b)
akan bekerja. Di sini Anda mungkin ingin menulis ulang kode sebagaisumber
Alasan pengecualian adalah bahwa
and
panggilan secara implisitbool
. Pertama di operan kiri dan (jika operan kiriTrue
) maka di operan kanan. Jadix and y
setara denganbool(x) and bool(y)
.Namun
bool
pada anumpy.ndarray
(jika mengandung lebih dari satu elemen) akan mengeluarkan pengecualian yang telah Anda lihat:The
bool()
panggilan yang implisitand
, tetapi juga dalamif
,while
,or
, sehingga salah satu contoh berikut akan juga gagal:Ada lebih banyak fungsi dan pernyataan dalam Python yang menyembunyikan
bool
panggilan, misalnya2 < x < 10
hanyalah cara penulisan lainnya2 < x and x < 10
. Danand
akan memanggilbool
:bool(2 < x) and bool(x < 10)
.The elemen-bijaksana setara untuk
and
akan menjadinp.logical_and
fungsi, sama Anda bisa menggunakannp.logical_or
sebagai setara untukor
.Untuk array boolean - dan perbandingan suka
<
,<=
,==
,!=
,>=
dan>
pada NumPy array kembali array NumPy boolean - Anda juga dapat menggunakan elemen-bijaksana bitwise fungsi (dan operator):np.bitwise_and
(&
operator)dan
bitwise_or
(|
operator):Daftar lengkap fungsi logis dan biner dapat ditemukan di dokumentasi NumPy:
sumber
jika Anda bekerja dengan
pandas
apa yang memecahkan masalah bagi saya adalah bahwa saya mencoba melakukan perhitungan ketika saya memiliki nilai NA, solusinya adalah menjalankan:df = df.dropna()
Dan setelah itu perhitungan itu gagal.
sumber
Pesan kesalahan yang diketik ini juga menunjukkan sementara
if-statement
perbandingan dilakukan di mana ada array dan misalnya bool atau int. Lihat misalnya:Klausa ini memiliki dataset sebagai array dan bool adalah "pintu terbuka" ...
True
atauFalse
.Dalam hal fungsi dibungkus dalam
try-statement
Anda akan menerimaexcept Exception as error:
pesan tanpa jenis kesalahan:sumber
coba ini => numpy.array (r) atau numpy.array (yourvariable) diikuti oleh perintah untuk membandingkan apa pun yang Anda inginkan.
sumber