Saya mencoba melakukan pembagian bijak dengan python, tetapi jika angka nol ditemukan, saya perlu hasil bagi menjadi nol.
Sebagai contoh:
array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])
array1 / array2 # should be np.array([0, 1, 2])
Saya selalu bisa menggunakan for-loop melalui data saya, tetapi untuk benar-benar memanfaatkan pengoptimalan numpy, saya memerlukan fungsi pembagian untuk mengembalikan 0 setelah membagi dengan nol kesalahan daripada mengabaikan kesalahan.
Kecuali saya melewatkan sesuatu, sepertinya numpy.seterr () dapat mengembalikan nilai saat terjadi kesalahan. Apakah ada yang punya saran lain tentang bagaimana saya bisa mendapatkan yang terbaik dari numpy sementara mengatur pembagian saya sendiri dengan penanganan kesalahan nol?
python
arrays
numpy
error-handling
divide-by-zero
hlin117
sumber
sumber
Jawaban:
Di numpy v1.7 +, Anda dapat memanfaatkan opsi "di mana" untuk ufuncs . Anda dapat melakukan banyak hal dalam satu baris dan Anda tidak perlu berurusan dengan pengelola konteks yang salah.
Dalam hal ini, ia melakukan kalkulasi bagi di mana saja 'di mana' b tidak sama dengan nol. Ketika b sama dengan nol, maka itu tetap tidak berubah dari nilai apa pun yang Anda berikan pada awalnya dalam argumen 'keluar'.
sumber
a
dan / ataub
mungkin array integer, maka itu konsep yang sama, Anda hanya perlu secara eksplisit mengatur jenis keluaran yang benar:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
out=np.zeros_like(a)
sangat penting, seperti yang dinyatakan di baris komentar.np.divide(a, b, out=np.zeros_like(a), where=b!=0)
, saya mendapatkan kesalahanAssigning to function call which doesn't return
. Yang aneh adalah, saya menggunakannya dua kali dan kesalahan hanya muncul sekali.Berdasarkan jawaban @Franck Dernoncourt, memperbaiki -1 / 0:
sumber
~
membalikkanTrue
danFalse
dalam array numpy:print ~ np.array([ True, False, False ])
.c[ ~ np.isfinite( c )] = 0
artinya: temukan posisi di manac
adalah finite, balikkan ke NOT finite with~
, dan setel nilai not finite ke 0. Lihat juga stackoverflow.com/search?q=[numpy]+"boolean+indexing "Membangun dari jawaban lain, dan meningkatkan:
0/0
penanganan dengan menambahkaninvalid='ignore'
kenumpy.errstate()
numpy.nan_to_num()
untuk mengonversinp.nan
ke0
.Kode:
Keluaran:
sumber
0/0
serta1/0
kesalahan.a
ataub
mengandungNaN
, solusi Anda tiba-tiba memberi0
hasil. Ini dapat dengan mudah menyembunyikan kesalahan dalam kode Anda dan benar-benar tidak terduga.numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
adalah tanda tangannya.One-liner (melempar peringatan)
sumber
Coba lakukan dalam dua langkah. Divisi dulu, lalu ganti.
The
numpy.errstate
line opsional, dan hanya mencegah NumPy dari memberitahu Anda tentang "kesalahan" membagi dengan nol, karena Anda sudah berniat untuk melakukannya, dan penanganan kasus itu.sumber
np.errstate(divide='ignore'):
divide='warn'
juga dapat berguna jika dia ingin tetap diberi tahu.Anda juga dapat mengganti berdasarkan
inf
, hanya jika array dtypes adalah float, sesuai jawaban ini :sumber
Satu jawaban yang saya temukan saat mencari pertanyaan terkait adalah memanipulasi keluaran berdasarkan apakah penyebutnya nol atau tidak.
Misalkan
arrayA
danarrayB
telah diinisialisasi, tetapiarrayB
memiliki beberapa angka nol. Kami dapat melakukan hal berikut jika ingin menghitungarrayC = arrayA / arrayB
dengan aman.Dalam hal ini, setiap kali saya membagi dengan nol di salah satu sel, saya mengatur sel menjadi sama dengan
myOwnValue
, yang dalam hal ini akan menjadi nolCatatan kaki: Dalam retrospeksi, baris ini tidak diperlukan lagi, karena
arrayC[i]
dipakai ke nol. Tetapi jika kasusnya seperti itumyOwnValue != 0
, operasi ini akan melakukan sesuatu.sumber
Solusi lain yang layak disebutkan:
sumber