शून्य से विभाजित करके 0 कैसे लौटाएं


101

मैं अजगर में एक तत्व वार विभाजित करने की कोशिश कर रहा हूं, लेकिन अगर एक शून्य का सामना करना पड़ता है, तो मुझे बस शून्य होने के लिए भागफल की आवश्यकता है।

उदाहरण के लिए:

array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])

array1 / array2 # should be np.array([0, 1, 2])

मैं हमेशा अपने डेटा के माध्यम से फॉर-लूप का उपयोग कर सकता था, लेकिन वास्तव में numpy के अनुकूलन का उपयोग करने के लिए, मुझे त्रुटि को अनदेखा करने के बजाय शून्य त्रुटियों से विभाजित होने पर 0 वापस करने के लिए डिवाइड फ़ंक्शन की आवश्यकता है।

जब तक मैं कुछ याद कर रहा हूँ, यह numpy.seterr नहीं लगता है () त्रुटियों पर मान वापस कर सकता है। क्या किसी के पास कोई अन्य सुझाव है कि मैं शून्य त्रुटि हैंडलिंग द्वारा अपने स्वयं के विभाजन को सेट करते समय सुन्न से सर्वश्रेष्ठ कैसे प्राप्त कर सकता हूं?


मेरे अजगर संस्करण (पायथन 2.7.11 | कॉन्टिनम एनालिटिक्स, इंक।) में बिल्कुल वही आउटपुट है जो आपको मिलता है। एक चेतावनी के साथ।
रेमन मार्टिनेज

सबसे
रसीला

जवाबों:


187

Numpy v1.7 + में, आप के लिए "जहाँ" विकल्प का लाभ ले सकते ufuncs । आप एक पंक्ति में काम कर सकते हैं और आपको गलत संदर्भ प्रबंधक से निपटने की आवश्यकता नहीं है।

>>> a = np.array([-1, 0, 1, 2, 3], dtype=float)
>>> b = np.array([ 0, 0, 0, 2, 2], dtype=float)

# If you don't pass `out` the indices where (b == 0) will be uninitialized!
>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)
>>> print(c)
[ 0.   0.   0.   1.   1.5]

इस मामले में, यह विभाजन को कहीं भी 'जहाँ b' के बराबर शून्य नहीं करता है। जब बी बराबर शून्य करता है, तो यह मूल रूप से 'आउट' तर्क में दिए गए मूल्य से अपरिवर्तित रहता है।


4
यदि aऔर / या bपूर्णांक सरणियाँ हो सकती हैं, तो यह एक ही अवधारणा है, आपको बस स्पष्ट रूप से सही आउटपुट प्रकार निर्धारित करने की आवश्यकता है:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
DStauffman

out=np.zeros_like(a)महत्वपूर्ण है, जैसा कि टिप्पणी की गई पंक्ति में कहा गया है।
जोनाथन öström

1
यदि मैं उपयोग करता हूं np.divide(a, b, out=np.zeros_like(a), where=b!=0), तो मुझे त्रुटि मिलती है Assigning to function call which doesn't return। अजीब बात है, मैं इसे दो बार उपयोग करता हूं और त्रुटि केवल एक बार पॉप अप होती है।
जेलर मुलडर

46

@ फ्रेंक डर्नोनकोर्ट के उत्तर पर बिल्डिंग, फिक्सिंग -1 / 0:

def div0( a, b ):
    """ ignore / 0, div0( [-1, 0, 1], 0 ) -> [0, 0, 0] """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
        c[ ~ np.isfinite( c )] = 0  # -inf inf NaN
    return c

div0( [-1, 0, 1], 0 )
array([0, 0, 0])

धन्यवाद, मैंने @Frank Dernoncourt के कोड के साथ उस बग को भी नहीं पकड़ा।
hlin117

नमस्ते, मैं सरणी गणित करने की कोशिश कर रहा हूं और मैं चाहता हूं कि 0/0 परिणाम 0 पर हो लेकिन मैं अपनी गणना में भी np.NaN को अनदेखा करना चाहता हूं। क्या उसके लिए यह काम करेगा? इसके अलावा, मैं समझने की कोशिश कर रहा हूं। C [~ np.isfinite (c)] = 0 क्या करता है? मैंने कभी अजगर में ~ इस्तेमाल नहीं किया। ये किसके लिये है? धन्यवाद
user20408

@ user20408, ~उलट Trueऔर FalseNumPy सरणी में: print ~ np.array([ True, False, False ])c[ ~ np.isfinite( c )] = 0साधन: पदों का पता लगाएं जहां cउन की विपरीत साथ नहीं परिमित करने के लिए, परिमित है ~, और 0 पर नहीं-परिमित मूल्यों को निर्धारित भी देखें stackoverflow.com/search?q=[numpy]+"boolean+indexing "
डेनिस

43

अन्य उत्तरों पर निर्माण, और सुधार करना:

  • 0/0जोड़कर से निपटने invalid='ignore'के लिएnumpy.errstate()
  • numpy.nan_to_num()में परिवर्तित np.nanकरने के लिए परिचय 0

कोड:

import numpy as np

a = np.array([0,0,1,1,2], dtype='float')
b = np.array([0,1,0,1,3], dtype='float')

with np.errstate(divide='ignore', invalid='ignore'):
    c = np.true_divide(a,b)
    c[c == np.inf] = 0
    c = np.nan_to_num(c)

print('c: {0}'.format(c))

आउटपुट:

c: [ 0.          0.          0.          1.          0.66666667]

2
जाँच के 0/0साथ-साथ 1/0त्रुटियों के लिए अच्छा काम ।
hlin117

मैंने DStauffman के उत्तर में दिए गए उदाहरण सरणियों के साथ आपकी विधि की कोशिश की और इसका परिणाम np.inf के बजाय बहुत अधिक संख्या में हुआ, जो अंतिम परिणाम पर बना हुआ है
Gal Avineri

मैं इस दृष्टिकोण को हतोत्साहित करूंगा। यदि दोनों में से aया bशामिल NaN, अपने समाधान अचानक देता है 0एक परिणाम के रूप। यह आपके कोड में त्रुटियों को आसानी से छिपा सकता है और बिल्कुल अप्रत्याशित है।
डेरिह

हाल ही में सुन्न मैनुअल के अनुसार nan_to_num () पॉजिटिव इन्फैक्शन और नेगेटिव इन्फैक्शन के लिए भी विकल्प लेता है। numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)हस्ताक्षर है।
क्रेग हिक्स


13

इसे दो चरणों में करने का प्रयास करें। पहले विभाजन करें, फिर प्रतिस्थापित करें।

with numpy.errstate(divide='ignore'):
    result = numerator / denominator
    result[denominator == 0] = 0

numpy.errstateलाइन वैकल्पिक है, और बस रोकता है, शून्य से भाग देने की "त्रुटि" बारे में आपको बता रहा से Numpy के बाद से आप पहले से ही ऐसा करने के लिए इच्छुक रहे हैं, और उस मामले से निपटने के।


5
आपको शायद इस संदर्भ में विभाजन करना चाहिएnp.errstate(divide='ignore'):
वारेन वीकेसर

@WarrenWeckesser मेला बिंदु। मैंने संदर्भ को शामिल करने के लिए उत्तर संपादित किया है। divide='warn'उपयोगी हो सकता है अगर s / वह अभी भी अधिसूचित करना चाहता था।
पाई मैरिलिन

2

आप इसके आधार पर भी प्रतिस्थापित कर सकते हैं inf, केवल अगर सरणी dtypes फ्लोट हैं, इस उत्तर के अनुसार :

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> c = a / b
>>> c
array([ inf,   2.,   1.])
>>> c[c == np.inf] = 0
>>> c
array([ 0.,  2.,  1.])

0

एक उत्तर मुझे लगा कि संबंधित प्रश्न की खोज आउटपुट को हेरफेर करने के लिए थी जो कि हर पर शून्य था या नहीं।

मान लीजिए arrayAऔर arrayBआरंभ किया गया है, लेकिन arrayBकुछ शून्य हैं। यदि हम arrayC = arrayA / arrayBसुरक्षित रूप से गणना करना चाहते हैं तो हम निम्नलिखित कर सकते हैं ।

इस मामले में, जब भी मेरे पास किसी एक सेल में शून्य से विभाजित होता है, तो मैं सेल को बराबर होने के लिए सेट करता हूं myOwnValue, जो इस मामले में शून्य होगा

myOwnValue = 0
arrayC = np.zeros(arrayA.shape())
indNonZeros = np.where(arrayB != 0)
indZeros = np.where(arrayB = 0)

# division in two steps: first with nonzero cells, and then zero cells
arrayC[indNonZeros] = arrayA[indNonZeros] / arrayB[indNonZeros]
arrayC[indZeros] = myOwnValue # Look at footnote

फुटनोट: रेट्रोस्पेक्ट में, यह लाइन अनावश्यक वैसे भी है, क्योंकि arrayC[i]इसे तत्काल शून्य किया जाता है। लेकिन अगर ऐसा होता myOwnValue != 0, तो यह ऑपरेशन कुछ करता।


0

उल्लेख के लायक एक अन्य समाधान:

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> b_inv = np.array([1/i if i!=0 else 0 for i in b])
>>> a*b_inv
array([0., 2., 1.])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.